在中文 Windows 下比如输出到文本文件,用 Chr(205) 出来的是0x00,用 ChrW(205) 出来的是 0x3F,即"?",这应该是系统作了处理吧?ChrW() 在英文 Windows 系统下的功能是正常的。请问如何处理才能避开 OS 本身的处理,兼容各种不同语言版本的 Windows 呢?谢谢!

解决方案 »

  1.   

    用ChrW()出来的是Unicode,而VB中的String是Unicode
      

  2.   

    可以用
    StrConv(string, vbUnicode)
    StrConv(string, vbFromUnicode)
    进行相互装换
      

  3.   

    Unicode 只是内部的运算过程吧,我记得最后输出还是要转 ANSI 的。问题是,输出的既不是正确的 ASCII 编码,也不是正确的 Unicode 编码呀!
      

  4.   

    编码是不会错的,OS也不可能干涉VB程序的运行;
    至于不同的系统显示不同,是另外一回事情~
      

  5.   

    这么说吧,我要生成的字符串如 str1,在英文系统下可以正确的生成,但是在中文系统下就成了 str2 这样,那两个问号不是因为字库中没有相应字符而变成 ?,输出的字符就是 0x3F 了。
    str1    ÌABÇ,BXÈCD~Π
    str2    ìAB?,BXèCD~?
      

  6.   

    StrConv(string, vbUnicode)
    StrConv(string, vbFromUnicode)
      

  7.   

    ASCII 标准是7位的,也就是只0-127是统一定义的,128-255为扩展ASCII,为不同语系的字符集保留,也就是说不同语言操作系统中,其定义也不同。也并不是都可显示!同为英语国家,美国的定义与英国的就不一样。在中、日、韩等国的象形文字符号语系中
    对于9X内核,采用双字符(DBCS)方案,扩展ASCII总是与其后第二个字节合并为一个字符;而对于NT内核,统一采用了Unicode方案,单独一个扩展ASCII也没意义。
      

  8.   

    使用Binary格式么,爱怎么写怎么写
      

  9.   

    我试试全部转为 Binary 输出吧,谢谢!
      

  10.   

    DBCS 字符串操作函数
    虽然双字节字符由一个前导字节和一个后续字节组成,并存储在两个连续的字节里,但是在任何涉及到字符和字符串的操作时,它应作为一个单元处理。一些字符串操作函数可以处理基于字符的所有字符串,包括 DBCS 字符。这些函数有 ANSI/DBCS 版本、二进制版本或者 Unicode 版本,如下表所示。根据操作字符串的目的,使用适当的函数。下表中函数的“下”版本尤其适合于使用二进制数据的字符串,“W”版本适合于使用 Unicode 的字符串。函数 描述 
    Asc 返回字符串第一个字符的 ANSI 或 DBCS 字符代码。 
    AscB 返回给定包含二进制数据的字符串第一个字节的值。 
    AscW 返回字符串第一个字符的 Unicode 字符代码。 
    Chr 返回包含指定 ANSI 或 DBCS 字符代码的字符串。 
    ChrB 返回包含指定字节的二进制字符串。 
    ChrW 返回包含指定 Unicode 字符代码的字符串。 
    Input 从文件中返回指定数目的 ANSI 或 DBCS 字符。 
    InputB 从文件中返回指定数目的字节。 
    InStr 返回一字符串在另一字符串中第一次出现的位置。 
    InStrB 返回一字节在另一二进制字符串中第一次出现的位置。 
    Left, Right 返回字符串左边或右边指定数目的字符。 
    LeftB, RightB 返回二进制字符串左边或右边指定数目的字节。 
    Len 返回以字符数为单位的字符串长度。 
    LenB 返回以字节数为单位的字符串长度。 
    Mid 从字符串中返回指定数目的字符。 
    MidB 从二进制字符串中返回指定数目的字节。 
    表中没有 "B" 或 "W" 的函数能正确处理 DBCS 或 ANSI 字符。除上述函数以外,String 函数也能处理 DBCS 字符。这就是说所有函数把 DBCS 字符作为一个字符处理,即使该字符由两个字节组成。当处理 SBCS 和 DBCS 字符时,这些函数的过程是不同的。例如,在 Visual Basic 中使用 Mid 函数从字符串中返回指定数目的字符。在使用 DBCS 的区域中,字符数和字节数不一定相同,Mid 函数只返回字符数而不是字节数。大多数情况下,由于这些函数能够正确处理 ANSI、DBCS 和 Unicode 字符串,因此处理字符串数据时,都使用基于字符的函数。基于字节的字符串操作函数,例如 LenB 和 LeftB 用于处理二进制数据的字符串数据。当向 String 变量存储字符或从 String 变量读取字符时,Visual Basic 会自动完成 Unicode 和 ANSI 字符间的转换。当处理二进制数据时,应使用 Byte 数组而不是 String 变量和基于字节的字符串操作函数。详细信息 关于相应的函数,请参阅《语言参考》。处理二进制数据的字符串时,使用下列代码将字符串中的字符映射到 Byte 数组中:Dim MyByteString() As Byte
    '将字符串映射到一 Byte 数组中。
    MyByteString = "ABC"
    '显示二进制数据。
    For i = LBound(MyByteString) to UBound(MyByteString)
       Print Right(" " + Hex(MyByteString(i)),2) + " ,";
    Next
    PrintDBCS 字符串转换
    Visual Basic 提供了一些对 DBCS 字符进行字符串转换的函数:StrConv、UCase 和 LCase。StrConv 函数
    StrConv 函数的全局选项是将大写转换成小写或将小写转换成大写。此外,该函数还有一些 DBCS 特定的选项。例如,通过指定该函数第二个参数中的 vbWide,可将半角字符转换成全角字符。也可用此函数将一种字符类型转换成另一种字符类型,如日语中的平假名转换成片假名。如果与系统的 LocaleID 不同,StrConv 允许您为该字符串指定一个 LocaleID。也可使用 StrConv 函数将 Unicode 字符转换成 ANSI/DBCS 字符或将 ANSI/DBCS 字符转换成 Unicode 字符。通常,Visual Basic 中的字符串由 Unicode 字符组成。当需要处理 ANSI/DBCS 字符串时(例如,在将字符串写入文件之前,计算字符串的字节数),可使用 StrConv 函数的这一功能。全角字符的大小写转换
    可使用 StrConv 函数的 vbUpperCase 或 vbLowerCase 选项,或者使用 UCase 或 LCase 函数进行字母的大小写转换。使用这些函数完成 DBCS 包括 ANSI 字符的英语全角字符的大小写转换。
      

  11.   

    嗯,我有点明白了,这个问题还有点麻烦,我需要的输出结果中有些字符必须是 ASCII 码在 128~255 之间的中文系统不能显示的拉丁字符。是不是要在运算过程中先转成 Hex 再输出,而不是得到 ChrW(205) 这样的字符后再转为 Hex,这时可能已经被系统给替换成问号了。这样好多函数全部要重写过了,晕!
      

  12.   

    Dim b() As Byte
    如果s是ascii串
    b = s
    否则
    b = StrConv(s, vbFromUnicode)
    put #1,,b
      

  13.   

    谢谢楼上的,我又看了一下资料,StrConv() 原来有个参数是 LCID,使用 LCID = 1033 就搞定了,用2052是不行的,多谢!