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 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 问题的主要内容,如果未能解决你的问题,请参考以下文章