检测无状态字符集

时间:2016-01-03 16:11:45

标签: java character-encoding

Java中是否有办法检测所有可用字符集的无状态字符集(Charset#availableCharsets())?

无状态意味着根据this description(见无状态和有状态),给定的字符集不会对多个编码字符集使用移位状态。

我需要这些信息,因为我目前正在开发一种工具,它可以在随机位置解码二进制流,而使用有状态字符集是不可能的。

编辑:我注意到,在Google搜索有状态编码时,只显示ISO-2022。这些是唯一可用的有状态编码吗? 在这种情况下,可以通过区分编码来解决问题。名称的状态(即所有" ISO-2022" s是有状态的/所有其他的都没有)。

1 个答案:

答案 0 :(得分:0)

似乎没有办法知道Charset是否有状态。

除了ISO-2022,还有一些有状态字符集,例如:

  • Java SE Supported Encodings中的字符集中,EUC(EUC-JPEUC-KR等)具有明确的状态。它使用单班制来表达其状态。因此,例如,当您在流中指向ASCII字节时,您必须看到一个前一个字节,因为ASCII字节可以显示为尾随字节。有关详细信息,请参见https://en.wikipedia.org/wiki/Extended_Unix_Code
  • 除EUC外,Shift_JISWindows-31j隐含状态。例如,0x83 0x84中的表示0x84 0x83,而с表示Shift_JIS。因此,当您获得... 0x83 0x84 0x83 0x84 0x83 0x84 0x83 ...之类的字节数组时,必须回溯到数组的开头,以确定该数组是指ヤヤヤヤヤ...还是ссссс...
  • 除了Java SE支持的编码之外,日语大型机中使用的某些字符集(JIPS,KEIS等)是有状态的。如果您的JDK支持此类字符集,则必须对其进行处理。有关详细信息,请参见https://ja.wikipedia.org/wiki/%E6%BC%A2%E5%AD%97%E3%82%B7%E3%83%95%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89(日语)。