【转载】如何用VB6在中文系统下把Unicode编码的日文字符转成Shif
发布时间:2020-12-16 22:59:27 所属栏目:大数据 来源:网络整理
导读:这个题目有点变态,不过有时确实会有这种需求,起码我就碰到过。同样变态的需求还有“如何用VB6在日文系统下把Unicode编码的中文字符转成GB2312编码”。这种需求有个比较时髦的名字,叫做“国际对应”。本文将提供几种解决方法。 一:繁琐的方法 如果之前看
这个题目有点变态,不过有时确实会有这种需求,起码我就碰到过。同样变态的需求还有“如何用VB6在日文系统下把Unicode编码的中文字符转成GB2312编码”。这种需求有个比较时髦的名字,叫做“国际对应”。本文将提供几种解决方法。
一:繁琐的方法 如果之前看过我贴的那篇 VB6中EBCDIC码和Unicode码之间的相互转换方法,可能马上就想到答案了。没错,我们可以用WideCharToMultiByte,把里面的代码页改成日文932就行了。WideCharToMultiByte接受的源数据是Unicode编码的数组,那么问题自然就转变为如何把这个字符串转成数组。下面有两种做法: 1 转成Byte数组
1
Private
Function
Uni2WChar(str
As
String
)
As
Byte
()
2 Dim i As Long 3 Dim idx As Long 4 Dim iC As Integer 5 Dim iH As Integer 6 Dim iL As Integer 7 Dim byt() As Byte 8 9 idx = 0 10 ' 多定义一字节,作为结尾'/0'(就像C里面一样) 11 ReDim byt( Len (str) * 2 + 1 ) 12 13 For i = 1 To Len (str) 14 iC = AscW( Mid (str,i, 1 )) 15 iH = (iC And & HFF00) / & H100 16 If iC < 0 Then iH = iH + & H100 17 iL = iC And & HFF 18 ' 高低字节是反着存的 19 byt(idx) = iL 20 byt(idx + 1 ) = iH 21 idx = idx + 2 22 Next i 23 24 Uni2WChar = byt 25 EndFunction 2 转成Integer数组 其实,大可不必自己大费周折地手动把一个个16位的Unicode字符转成8位的字节数组,直接转成16位的Integer数组(VB6的Integer是16位的哦)就行了,剩下的事情交给机器做--从物理上说,存数据的这块连续内存的大小和内容完全和上面是一样的。所不同的只在逻辑上。
1
Private
Function
Uni2WChar(str
As
String
)
As
Integer
() That's all!记得要把那个WChar2XXX函数的参数类型改成Integer数组。
2 Dim i As Long 3 Dim ary() As Integer 4 5 ReDim ary( Len (str)) 6 7 For i = 1 To Len (str) 8 ary(i - 1 ) = AscW( Mid (str, 1 )) 9 Next i 10 11 Uni2WChar = ary 12 EndFunction 二:最简捷的方法 StrConv(string,conversion,LCID) 还记得StrConv函数的最后一个参数吗?MSDN上是这么说的: LCID Optional. The LocaleID,if different than the system LocaleID. (The system LocaleID is the default.) 大部分的时候都是用VB6提供的默认值。现在这个参数就派上用场了,下面是例子:
1
Dim
byt()
As
Byte
2 ' 把"一二三"转成日文Shift-JIS编码,LCID=0x0411 3 byt = StrConv( " 一二三 " ,vbFromUnicode, & H411) 4 ' 把"一二三"转成中文GB2312编码,LCID=0x0804 5 byt = StrConv( " 一二三 " , & H804)
一行就搞定!LCID还有很多值,具体参照MSDN,搜关键字“CultureInfo 类”。同样,你应该先确认系统安装了对应LCID的代码页。
原文网址:
http://www.cnblogs.com/IDqq/archive/2009/04/22/367412.html
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |