VB UTF-8 问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB UTF-8 问题相关的知识,希望对你有一定的参考价值。

有一个文件,文件名是UTF-8 当然 文件很多也有其它编码的,所以就举例。
文件内容也是UTF-8
现在遇到的问题是 文件不能打开
文件内容无法读取
1.试着随便新建个工程放个文本框,运行后将文件名复制 进去不能正常显示
2.文件读取过程中 调试发现在处理时VB先将数据自动转换编码再赋给变量,造成所有转换函数没有作用。
3假如文件名可以正常读取(例如为英文或者UTF-8字符有时候能读取)但是文件内容包含UTF-8时还可以考虑二进制,但是对于文件名就没有什么好的办法

申明 可能我遇到的并不是UTF-8 ,但是确认VB会自动转换编码,这个就是问题所在,
其次如果叫我手动转换什么的,就不要回答了,我还笨到不会转换,现在是VB遇到了一个很小,但是很麻烦的问题,
这个问题困扰许久 基本就是VB 编码 Unicode 之类的。问了好几次,没有解决,弄得我的程序一直停在那里。望高手解决
1 如何解决Unicode 包括 UTF-8 -16 之类的
2 如何以二进制的方法读取文件名
3如何读取含有utf-8 就是乱码的文件名
4对于VB自动转换再赋值的问题如何解决,这一现象是为什么。
能回答多少算多少吧。

Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Const CP_UTF8 = 65001

Function Utf8ToUnicode(ByRef Utf() As Byte) As String
Dim lRet As Long
Dim lLength As Long
Dim lBufferSize As Long
lLength = UBound(Utf) - LBound(Utf) + 1
If lLength <= 0 Then Exit Function
lBufferSize = lLength * 2
Utf8ToUnicode = String$(lBufferSize, Chr(0))
lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(Utf(0)), lLength, StrPtr(Utf8ToUnicode), lBufferSize)
If lRet <> 0 Then
Utf8ToUnicode = Left(Utf8ToUnicode, lRet)
End If
End Function

Private Sub Form_Load()
Dim a As String
Dim b() As Byte
Dim i As Integer

a = "E9 A2 91 E9 81 93 31 00"

ReDim b(UBound(Split(a, " ")) - 1) As Byte
For i = 0 To UBound(Split(a, " ")) - 1
b(i) = "&H" & Split(a, " ")(i)
Next i

Text1.Text = Utf8ToUnicode(b())

End Sub
参考技术A 尝试用 StrConv() 函数看有没有帮助,例如:
FileName = StrConv(UFileName, vbFromUnicode)
再不就要研究一下相关的 Windows API 了...
参考技术B 1.没考虑过
2. FileOpen(1, "", OpenMode.Binary)'VB.NEt2010的代码..VB6也应该差不多
3.请吧单双字节考虑进去,否则还是以二进制的方法读取文件
4.没考虑过,不过文字本质都是些图片不转换用不了吧

File.Exists 在 C# 中工作,但在 VB.NET 中不起作用

【中文标题】File.Exists 在 C# 中工作,但在 VB.NET 中不起作用【英文标题】:File.Exists is working in C#, but doesn't work in VB.NET 【发布时间】:2015-10-14 04:55:36 【问题描述】:

我遇到了一个奇怪的问题。

VB.NET - 不工作

Dim stringData As String = Encoding.UTF8.GetString(buffer, 0, buffer.Length)    
If Not [String].IsNullOrEmpty(stringData) AndAlso System.IO.File.Exists(stringData) Then
    Process.Start(stringData)
End If 

工作

  If Not [String].IsNullOrEmpty(stringData) AndAlso System.IO.File.Exists(stringData) Then
      Process.Start(stringData)
End If
 Process.Start(stringData)

C# - 工作:

string stringData = Encoding.UTF8.GetString(buffer, 0, buffer.Length);

if (!String.IsNullOrEmpty(stringData) && System.IO.File.Exists(stringData))

    Process.Start(stringData);

谁能解释我做错了什么?

【问题讨论】:

我不确定,但这似乎是人为的问题。你确定文件路径是完全相同相同的吗? 插入一个断点并检查每个代码库的 stringData 变量是什么。 它是如何“不工作”的?如果它没有启动程序,请检查异常。也许您使用的相对路径对于 C# 编译的 EXE 是正确的,但是 VB.NET 编译的 EXE(也就是说,在不同的位置)该路径不再有效。 而“工作 - 不工作”代表... @Alexander 我怀疑在 VB 版本中,您的缓冲区比您预期的要大一个字节。在 C# 中,您在声明数组时给出数组中元素的数量,而在 VB 中,您给出最后一个元素的索引。 【参考方案1】:

试试这个方法:

Dim stringData As String = GetFolderPath(SpecialFolder.MyDocuments) & "\my.exe" 'For example

            If Not String.IsNullOrEmpty(stringData) Then

                If File.Exists(stringData) Then

                    Process.Start(stringData)

                Else

                    MsgBox("File couldn't be found.", vbCritical, "MyApp")

                End If

            End If

【讨论】:

以上是关于VB UTF-8 问题的主要内容,如果未能解决你的问题,请参考以下文章

VB怎么把ANSI编码的txt文件转为UTF-8编码?

VB 字符串转换为UTF-8

vb中怎么把ansi转换成UTF-8

VB中MultiByteToWideChar如何调用使得文本格式由ANSI转换成UTF-8

高分求-VB 把ANSI文本转换成UTF-8,多谢!!

VB.Net GPX 到数据表