什么多字节字符集以0x7F开头并且长度为4个字节?

时间:2009-03-25 07:04:14

标签: encoding mbcs

我正在尝试使用一些遗留代码来正确显示中文字符。我尝试使用的一个字符编码以0x7F开头,长度为4个字节(包括0x7F字节)。有谁知道这是什么样的编码以及我可以在哪里找到它的信息?感谢..

更新: 我还必须使用一些日语编码,它以0xE3开始每个字符并且长度为3个字节。如果我在Windows中选择日语语言环境,它会在我的计算机上正确显示,但是它在我们的应用程序中无法正确显示。但是,如果选择了除日语之外的任何其他语言环境,我甚至无法正确查看文件名。所以我猜这个编码不是Unicode。有人知道这是什么吗?是ANSI吗?它是Shift JIS吗?

对于中国人来说,我用Unicode和UTF-8字符对它进行了测试,我得到了相同的模式; 0x7F后跟三个字节。 Unicode和UTF-8是一样的吗?

5 个答案:

答案 0 :(得分:8)

  

我尝试使用的一个字符编码以0x7F开头,长度为4个字节

其他字节是什么?你有这种编码的拉丁文吗?

如果它是“0x7f 0x ... 0x00 0x00”你正在看UTF-32LE。它也可以是两个UTF-16(LE或BE)字符。

大多数东亚编码使用0x80-0xFF作为非ASCII字符的前导字节;我所知道的不会使用前导0x7F作为ASCII删除以外的任何东西。

ETA:

  

应该有Byte Order Marks吗?

如果有一种带外方式的信号表明编码是'UTF-32LE'(可能是在它到达之前丢失的那个),则不需要BOM。

  

我还必须使用一些日语编码,它以0xE3开始每个字符并且长度为3个字节。

肯定是UTF-8。序列0xE3 0x ... 0x ...将导致U + 3000和U + 4000之间的字符,这是平假名/片假名所在的位置。

  

如果我在Windows中选择日语语言环境,它会在我的计算机上正确显示,但是,它在我们的应用程序中无法正常显示。

那么你的应用程序很可能是非Unicode兼容应用程序中令人遗憾的部分之一,仍然使用'W'后缀内的'A'(*)版本的Win32接口。您是否可以根据其实际编码读取字符串是没有意义的:符合非Unicode标准的应用程序永远无法在西方语言环境中显示东亚表意文字。

(*:以“ANSI”命名,这是Windows对“目前无论系统代码页设置如何”的误导性术语。这就是为什么更改您的语言环境会影响它。)

ETA(2):

好的,破解了。它不是我之前遇到过的任何标准化编码,但如果你假设编码Unicode代码点的前提,则解密起来相对容易。

0x00-0x7E: plain ASCII
0x7F A B C: Unicode character

Unicode转义中编码的字符可以通过将索引放在A,B和C的键字符串中并加在一起来计算:

A*0x1000 + B*0x40 + C

也就是说,它是一个基本的64字符集,但它不是通常的Base64标准。一些实验给出了一个关键字符串:

.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

'。'和'_'字符是猜测,因为您发布的所有字符都不会使用它们。我们需要更多数据才能找到确切的字符串。

所以,例如:

0x7F 3 u g
A=4 B=58 C=44
4*0x1000 + 58*0x40 + 44 = 0x4EAC
U+4EAC = 京

ETA(3):

是的,通过手动取出每个代码点并作为角色加入,创建本机Unicode字符串应该很容易。不太确定你所使用的平台上有什么可用,但任何支持Unicode的平台都应该能够简单地从代码点创建一个字符串(希望无需手动重新编码为UTF-16LE字节)。

我认为它必须是Unicode代码点,注意三个示例字符在相同的一般范围内具有第一个转义字符,并且与它们的Unicode代码点具有相同的数字顺序。其他两个字符似乎随机变化,因此它很可能是代码点的大端编码,并且可能是6位的base-64编码与可读ASCII中的位数一样多。

标准Base64本身以字母开头,这些字母会以一个数字开头,这个数字太多,不能在Basic Multilingual Plane中。所以我开始猜测'0123456789ABCDEFG ...'这将是键字符串的另一个显而易见的选择。这得到的数字接近给定字符的代码点,但有点太低了。在键字符串的开头插入一个额外的字符(因此数字'0'不映射到数字0)得到一个字符正确,另外两个字符非常接近;正确的那个没有小写字母,所以只改变小写字母我在大写和小写之间插入了另一个字符。这提供了正确的数字。

不能保证这实际上是正确的,但(除了任意选择插入的字符外)很可能是它。

答案 1 :(得分:1)

您可能需要查看维基百科上的chinese character encoding页面。我能看到的唯一编码总是4个字节UTF-32

GB 18030是当前标准的中文字符集,但长度可以是1到4个字节。

答案 2 :(得分:1)

试试chardet。它可以很好地猜测一串字节的字符编码。

  

Unicode和UTF-8是否相同?

没有。 UTF-8只是将Unicode字符表示为字节序列的一种方法。 Unicode是完整的标准,为每个字符分配数字和人类可读的标识符,以及关于字符的大量元数据。

答案 3 :(得分:0)

它可能是有效的unicode编码,例如utf-8或UTF16代理对。

答案 4 :(得分:0)

是的,中文版是UTF-8,Unicode的实现(编码)。 UTF-8对于ASCII字符长1个字节,对其他字符长达4个字节。