如何查找字节读取是日语还是英语?

时间:2014-08-18 14:27:44

标签: c++ unicode ascii multibyte multibyte-functions

我有一个包含日语和ascii字符的数组。 我试图找出所读的字符是英文字符还是日文字符。

为了解决这个问题我跟着

  1. 读取第一个字节,如果multicharcterswidth不等于1,则将指针移动到下一个字节 现在显示整个两个字节,并显示已读取日文字符。
  2. 如果multicharcterswidth等于1,则显示该字节。并且显示消息英语已被阅读。
  3. 以上算法工作正常,但在日语的半宽形式例如シ,ァ等情况下失败,因为它只有一个字节。 我怎样才能知道字符是日文还是英文?

    **注意:**我尝试过的 我从网上读到,第一个字节将告诉我是否是日语,我在算法的第一步中已经介绍过。但它的半宽不会起作用。

    编辑: 我正在解决的问题是我在字符的开头和结尾包含控制字符0X80以识别字符串。 我写了以下内容来确定控制字符的结束。

    cntlchar .....(我的角色,可以是日本人)..... cntlchar

    if ((buf[*p+1] & 0X80) && (mbMBCS_charWidth(&buf[*p]) == 1))
      // end of control characters reached
    else
      // *p++
    

    英语时效果很好,但是日本半宽不适合。

    我该如何处理?

2 个答案:

答案 0 :(得分:3)

您的数据必须使用Windows Codepage 932。这是 guess ,但检查代码点会显示您所描述的内容。

代码页显示007F范围内的字符是"英语" (更好的描述是" 7位ASCII"),819FE0FF范围内的字符是第一个字节多字节代码,A1DF之间的所有内容都是半角假名字符。

答案 1 :(得分:0)

对于单个字节,这是不切实际的。对于较大的数据集,您可以对字节进行统计分析,并查看它是否与已知的英语或日语模式匹配。例如,元音在英文文本中非常常见,但不同的日文字母具有相似的频率模式。

如果您的数据包含重音字符,事情会比测试位更复杂。

如果您正在处理Shift-JIS数据和Windows-1252编码文本,理想情况下您只需将其重新映射为UTF-8。没有标准的方法来识别文本文件中的文本编码,尽管像MIME这样的东西可以帮助在外部添加元数据。