如何解决 VB 获取UTF8 显示乱码的问题

作者&投稿:代哗 (若有异议请与网页底部的电邮联系)
高分求 VB 读取文本乱码问题,文本编码为UTF-8~

由于系统的需要,要国际化,但是由于那些字符串和翻译都写在EXCEL表格里面,如果一个一个的复制出来,那是相当麻烦的.所以老大让我写一个转换器,从EXECEL表格中导出数据,然后写到.PO扩展名的文本文件,要求UTF-8的编码格式的.

UTF-8是UNICODE编码格式的一种特殊情况.对于汉字的处理,它是采用了三个字节.对于它的具体情况,在这就不具体介绍,网上有相当多的资料.在VB中,有很多API可以提供,比如连接EXCEL、连接数据库、ADODB数据流等。这些API都可以很方便的引用。

在写的过程中,让我有点苦恼的是,用UTF-8编码编写的文本文件,都会产生一个BOM,这使得转换出来的文件,在系统编译中编译不过去,必须要把BOM去掉。接下来通过代码讲讲怎么实现。

Dim app As Excel.Application
Dim eworkbook As Workbook
Dim eworksheet As Worksheet
Dim eworksheet_count As Integer
Dim sheetName As String
Dim obj As Object
Dim FileNum

Dim file_path as String
Dim j as Integer
Dim filepath_save as String



filepath_save = "d:\"

Set app = New Excel.Application //连接EXCEL
Set eworkbook = app.Workbooks.Open(file_path)
eworkbook_count = eworkbook.Worksheets.count



For j = 1 To eworkbook_count

filepath_path = filepath_save & j & ".txt"
Set eworksheet = eworkbook.Sheets(j)
sheetName = eworksheet.Name
Set obj = New ADODB.Stream //设置ADODB流



With obj
.Open
.Charset = "UTF-8"
.Position = .Size
.WriteText "helloworld", 1
.SaveToFile filepath_save
.Close
End With


Set obj = Nothing


Open filepath_save For Input As #1 //消除UTF-8的BOM
Line Input #1, str
mm = Replace(str, str, "msgid """"")
Close #1
Open filepath_save For Binary As #FileNum
Put #FileNum, , mm
Close #FileNum
Next j


Set eworksheet = Nothing
eworkbook.Close
Set eworkbook = Nothing
app.Quit
Set app = Nothing
这是其中的一部分关键的代码,如果没有设置UTF-8的编码格式的话,一般NOTEPADE的写入格式都是默认为ANSI。好久没用VB写代码了,不过这次用起来还是感觉比较好的。所以在学校多学点是好的。

引用microsoft activex data object library
Dim s As Stream
Set s = New Stream
s.Open
s.Charset = "UTF-8"
s.Position = 0
s.LoadFromFile "C:\pppp.wap"
s.Position = 0

Text1 = s.ReadText

VB6.0可声明一个Object 数据类型,使用它的Charset属性为"UTF8",可解决TextBox控件中UTF8文本显示乱码问题。

  • Object 数据类型,Object 变量存储为 32 位(4
    个字节)的地址形式,其为对象的引用。利用 Set 语句,声明为 Object
    的变量可以赋值为任何对象的引用。

  • Charset 属性,设置或者返回字体中所用字符集。

  • 实现代码:

    Private Sub Command1_Click() '打开UTF-8文本

        Dim Ados As Object

        CommonDialog1.FileName = ""

        CommonDialog1.Filter = "文本文件(*.txt)|*.txt|"

        CommonDialog1.Action = 1

        str = CommonDialog1.FileName

        Set Ados = CreateObject("adodb.stream")

        With Ados

            .Charset = "utf-8"

            .Type = 2

            .Open

            .LoadFromFile str

             Text1.Text = .ReadText

            .Close

        End With

        Set Ados = Nothing

    End Sub



'-----------UTF8转Unicode编码
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Const CP_UTF8 = 65001

'Purpose:Convert Utf8 to Unicode
Public Function UTF8_Decode(ByVal sUTF8 As String) As String
Dim lngUtf8Size As Long
Dim strBuffer As String
Dim lngBufferSize As Long
Dim lngResult As Long
Dim bytUtf8() As Byte
Dim n As Long
If LenB(sUTF8) = 0 Then Exit Function
On Error GoTo EndFunction
bytUtf8 = StrConv(sUTF8, vbFromUnicode)
lngUtf8Size = UBound(bytUtf8) + 1
On Error GoTo 0
lngBufferSize = lngUtf8Size * 2
strBuffer = String$(lngBufferSize, vbNullChar)
'Translate using code page 65001(UTF-8)
lngResult = MultiByteToWideChar(CP_UTF8, 0, bytUtf8(0), _
lngUtf8Size, StrPtr(strBuffer), lngBufferSize)
'Trim result to actual length
If lngResult Then
UTF8_Decode = Left$(strBuffer, lngResult)
End If
EndFunction:
End Function

'把你上面获取的内容转一下就行,比如Text1.Text=UTF8_Decode(strResponse)
还可以加多一句InStr(1, strResponse, "charset=utf-8") > 0判断是否是UTF8编码再执行,不是UTF8的就直接显示。 还有些网页编码那里是大写的,要这样写InStr(1, strResponse, "charset=UTF-8") > 0

一般遇到这种问题有以下几种情况:
1.调用文件参数不正确(可以多试几次调用程序的参数类型)
2.调用文件返回值不正确(逐步调试)
3.子函数参数类型不正确。
总之一步一步的进行调试,看看究竟是哪一步出错就可以了。

'-----------UTF8转Unicode编码
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Const CP_UTF8 = 65001

'Purpose:Convert Utf8 to Unicode
Public Function UTF8_Decode(ByVal sUTF8 As String) As String
Dim lngUtf8Size As Long
Dim strBuffer As String
Dim lngBufferSize As Long
Dim lngResult As Long
Dim bytUtf8() As Byte
Dim n As Long
If LenB(sUTF8) = 0 Then Exit Function
On Error GoTo EndFunction
bytUtf8 = StrConv(sUTF8, vbFromUnicode)
lngUtf8Size = UBound(bytUtf8) + 1
On Error GoTo 0
lngBufferSize = lngUtf8Size * 2
strBuffer = String$(lngBufferSize, vbNullChar)
'Translate using code page 65001(UTF-8)
lngResult = MultiByteToWideChar(CP_UTF8, 0, bytUtf8(0), _
lngUtf8Size, StrPtr(strBuffer), lngBufferSize)
'Trim result to actual length
If lngResult Then
UTF8_Decode = Left$(strBuffer, lngResult)
End If
EndFunction:
End Function

'把你上面获取的内容转一下就行,比如Text1.Text=UTF8_Decode(strResponse)
还可以加多一句InStr(1, strResponse, "charset=utf-8") > 0判断是否是UTF8编码再执行,不是UTF8的就直接显示。 还有些网页编码那里是大写的,要这样写InStr(1, strResponse, "charset=UTF-8") > 0


临颍县19666327231: 如何解决 VB 获取UTF8 显示乱码的问题 -
水家复方: VB6.0可声明一个Object 数据类型,使用它的Charset属性为"UTF8",可解决TextBox控件中UTF8文本显示乱码问题.Object 数据类型,Object 变量存储为 32 位(4 个字节)的地址形式,其为对象的引用.利用 Set 语句,声明为 Object 的变...

临颍县19666327231: vb 如果对UTF - 8的文本进行读写? -
水家复方: 使用StrConv只能转换utf8 里面的单字节,双字符的字符还会是乱码. 另外还有的办法能转换utf8里面的大部分字符,但是唯独双字节和单字节相连的地方,两个字符会变乱码.如果是读取文件里面的字符,用adodb.stream处理的效果最好代码如...

临颍县19666327231: vb unicode问题 例如utf8 转换 -
水家复方: 我这个回答可能会让LZ失望....据我知道,如果你用的英语或者中文windows系统,VB6对Unicode的支持是很不好的,比如你的文件名含有欧洲语言的特殊字母或者比如阿拉伯语之类的字符,或者你的文件中含有这些字母,读出来的就是乱码.如果是读文件,Unicode编码的文件可以用binary的方法open,但是文件的开头会有个小乱码,不过也分是endian和big endian的类型,很复杂.如果是处理多语言或者Unicode的字符,建议楼主还是换程序语言吧...比如上标的TM符号,vb6是完全处理不了的.

临颍县19666327231: vb 读取UTF - 8编码文本文件 -
水家复方: 根据反馈,代码已作修改并调试通过:分二步: 一、建立一个模块,复制下面代码 Option Explicit Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As ...

临颍县19666327231: VB显示乱码问题 -
水家复方: 用inet获取网页源码为BYTE格式 .. 直接用UTF8_Decode 返回字符 就正常了... 上面那人回答的arr = StrConv(str, vbFromUnicode) 这段里..有些文字会出错的... 还是直接转好一点....

临颍县19666327231: vb转换UTF - 8编码 -
水家复方: 先把utf-8编码转成byte数组,然后 strconv(bytearr, vbunicode, &h804)

临颍县19666327231: vb.net如何处理UTF - 8格式的形参
水家复方: 可以转化为String类型啊

临颍县19666327231: vb 读取网络UTF - 8文件 -
水家复方: 答Private Declare Function icePub_UTF8toUnicode Lib "icePubDll.dll" (ByVal strUtf8Info As String,ByVal strInfo As String,ByVal strMaxLen As Integer) As Integer Private Declare Function icePub_fileUTF8toUnicode Lib "icePubDll.dll" (ByVal ...

临颍县19666327231: VB6写的程序读取UTF - 8文件有问题, 请问如果使用VB2010, 能解决问题吗? -
水家复方: 不能

临颍县19666327231: vb6 怎么识别带有Unicode UTF - 8 字符的文件名并打开 -
水家复方: Unincode和Utf-8也不是一种编码啊.你用什么方法读取的文件呢,按字节流读取是不会乱码的.还有,文件名更不可能出现乱码,要么你的VB版本有问题,要么程序有问题.请安装VB6的SP6补丁尝试.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网