Skip to content

Instantly share code, notes, and snippets.

@dulao5
Last active December 30, 2020 14:54
Show Gist options
  • Save dulao5/110cb8cdd4a47daa9e005ab4f5d9f1e9 to your computer and use it in GitHub Desktop.
Save dulao5/110cb8cdd4a47daa9e005ab4f5d9f1e9 to your computer and use it in GitHub Desktop.
WIP --- EUCJP and EUCJP-MS charset

ujis(EUCJP) 和 eucJP-ms

查阅了四个地方对 ujis/eucjp-ms 的描述,得到如下不同说法的比较:

byte range mysql ctype-ujis.cc#L33162
comment
mysql ctype-eucjpms.cc#L36410
comment
EUCJP(来自wikipedia EUCJP亚种 - eucJP-ms (来自wikipedia
[00..7F] ASCII [U+0000..U+007F] ASCII/JIS-Roman(one-byte/character) ASCII ASCII
[8E][A1..DF] JIS-X-0201 Katakana [U+FF61..U+FF9F] half-width katakana(two bytes/char) 半角片假名 (JIS X 0201) 半角片假名 (JIS X 0201)
[A1..FE][A1..FE] JIS-X-0208 JIS X 0208:1997(two bytes/char) JIS X 0208 JIS X 0208字符集合之外还有:
* [AD][A1..FE] NEC特殊文字 1面13区
* [F5..FE][A1..FE] 用户自定义文字(前半) 1面85区 - 94区
[8F][A1-FE][A1-FE] JIS-X-0212 JIS X 0212-1990(three bytes/char) JIS(JIS辅助汉字集合) (JIS X 0212) JIS辅助汉字集合 (JIS X 0212)之外还有:
* [8F][F3..F4][A1..FE] IBM扩展字符(JIS X 0212 以外) 2面83区 - 84区
* [8F][F5..FE][A1..FE] 用户自定义字符(后部分) 2面85区 - 94区

可见, 无论 ujis 还是 eucjp-ms , 都是包含下面几种字符

  • 单字节ASCII
    • 范围 [00..7F]
  • 双字节字符
    • 半角片假名 (JIS X 0201)
      • 范围 [8E][A1..DF] (只有 63 个字符)

      • 其中第一字节固定为 8F , 第二个字节的文字集合如下:

        JIS X 0201 char code table
        eucjp code harf-width katakana (utf8)
        0x8EA1
        0x8EA2
        0x8EA3
        0x8EA4
        0x8EA5
        0x8EA6
        0x8EA7
        0x8EA8
        0x8EA9
        0x8EAA
        0x8EAB
        0x8EAC
        0x8EAD
        0x8EAE
        0x8EAF
        0x8EB0
        0x8EB1
        0x8EB2
        0x8EB3
        0x8EB4
        0x8EB5
        0x8EB6
        0x8EB7
        0x8EB8
        0x8EB9
        0x8EBA
        0x8EBB
        0x8EBC
        0x8EBD
        0x8EBE
        0x8EBF ソ
        0x8EC0
        0x8EC1
        0x8EC2
        0x8EC3
        0x8EC4
        0x8EC5
        0x8EC6
        0x8EC7
        0x8EC8
        0x8EC9
        0x8ECA
        0x8ECB
        0x8ECC
        0x8ECD
        0x8ECE
        0x8ECF
        0x8ED0
        0x8ED1
        0x8ED2
        0x8ED3
        0x8ED4
        0x8ED5
        0x8ED6
        0x8ED7
        0x8ED8
        0x8ED9
        0x8EDA
        0x8EDB
        0x8EDC
        0x8EDD
        0x8EDE
        0x8EDF
        ※ 生成方式见 jisx0201.php
    • JIS X 0208文字区域
      • 范围 [A1..FE][A1..FE]
      • 对于 EUCJP 来说, 包含了 JIS X 0208 标准内规定的字符
      • 对于 EUCJP-ms 来说, 不仅包含了 JIS X 0208 标准内规定的字符,还包含了:
        • [AD][A1..FE] NEC特殊字符(1面13区)
        • [F5..FE][A1..FE] 用户自定义字符(前半部分) (1面85区 - 94区)
  • 三字节字符
    • 范围 [8F][A1-FE][A1-FE] (也就是首字节为 8F, 后面的两个字节值范围跟上面 JIS X 0208文字区域 相同)
    • 对于 EUCJP 来说, 包含了 JIS X 0212 标准内规定的字符
    • 对于 EUCJP-ms 来说, 不仅包含了 JIS X 0208 标准内规定的字符,还包含了:
      • [8F][F3..F4][A1..FE] IBM扩展字符(JIS X 0212 以外) (2面83区 - 84区)
      • [8F][F5..FE][A1..FE] 用户自定义字符(后半部分)(2面85区 - 94区)

临时结论

  • EUCJP/EUCJP-ms 的字节合法范围只包含表中列举的四种情况
  • EUCJP-ms 是对 EUCJP 的合理扩展, 使用了一些 EUCJP 里面未定义区域来定义了一些扩展字符

测试集合

  • ASCII : 参考ASCII标准即可
  • JISX0201 半角片假名: 网上没太多合适的字符表, 可以参考上面我列出的 JIS X 0201 char code table
  • JIS-X-0208 : 可以参考这个字符表
  • JIS-X-0212 : 可以参考这个字符表
    • 上面两个网页都是utf8的, 可以通过 EUC 列知道 EUCJP 的16进制编码, 截取表中utf8作为测试

TODO

  • 以上是我们基于一些公开资料的提炼, 是否正确还需要验证
  • 关于 mysql 的 eucjp/eucjp-ms 的具体区别, 我们正在咨询mysql官方。
  • 关于 NEC特殊字符 / IBM扩展字符 / 用户自定义字符 区域的 【EUCJP编码和文字映射表】, 还没找到公开资料, 准备稍后具体研究
  • 我打算验证上面 JIS-X-0208 / JIS-X-0212 两个字符表的正确性, 并导入mysql去实际验证
<?php
// usage : php jisx0201.php |iconv -f EUCJP -t UTF-8
$begin_char = 0xA1;
$end_char = 0xDF;
echo("output jisx0201 char table\n");
echo("eucjp code | harf-width katakana\n");
echo("--|--\n");
for($i = $begin_char; $i <= $end_char; $i++) {
echo("0x8E".strtoupper(dechex($i)) . " | ");
echo("\x8E".chr($i));
echo("\n");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment