如何在Python中编码/解码JIS X 208,JIS X 212和JIS X 213 Kuten字符代码?

问题描述

我正在尝试使用Kanjidic。特别是,Kanjidic2.xml.gz文件。但是,日文汉字在JIS X 0208,JIS X 0212,JIS X 0213中编码多个字符。

Kanjidic2.xml条目的一部分示例:

<character>
<literal>学</literal> <!-- this is the character I want -->
<codepoint>
<cp_value cp_type="ucs">5b66</cp_value> <!-- unicode hex value -->
<cp_value cp_type="jis208">1-19-56</cp_value> <!-- kuten code -->
</codepoint>
...
<variant var_type="jis208">1-53-60</variant> <!-- more kuten codes -->
<variant var_type="jis208">1-53-61</variant>
<variant var_type="jis212">1-33-55</variant>

在可用的Python character encodings中找不到JIS X 0208,JIS X 0212或JIS X 0213。 ISO 2022中包含所有三种JIS编码。 This question讨论了使用ISO 2022解码JIS 208,但未使用kuten代码。到目前为止,我尝试用ISO 2022解码kuten代码的尝试都没有成功。

如何解码这些JIS字符编码以在Python中获得日文汉字字符?最终,我想将它们切换为UTF-8。谢谢。

解决方法

kutens = [
          '1-14-02','1-16-01',# 丂 \u4e02                 cp_type="jis212">1-16-01
          '2-01-02',# ↑                         cp_type="jis213">2-01-02
          '1-19-34',# 1-19-34 蛎 b'\xb3\xc2' b'\\u86ce' b'\xe8\x9b\x8e'
          '1-19-56',# 1-19-56 学 b'\xb3\xd8' b'\\u5b66' b'\xe5\xad\xa6'
          '1-19-57',# 1-19-57 岳 b'\xb3\xd9' b'\\u5cb3' b'\xe5\xb2\xb3'
          '1-19-58',# 1-19-58 楽 b'\xb3\xda' b'\\u697d' b'\xe6\xa5\xbd' <cp_value cp_type="jis208">1-19-58</cp_value>
          '1-60-59',# 1-60-59 樂 b'\xdc\xdb' b'\\u6a02' b'\xe6\xa8\x82' <variant var_type="jis208">1-60-59</variant>
          '1-53-60',# 
          '1-53-61',# 
          '1-33-55',#
          '2-05-05'  # ? \U000213C4
         ]
for kuten in kutens:
    # ToDo/Unclear:
    #      0x00..0x7F: ASCII
    #      0x8E{A1..FE}: JISX0201 Katakana,with prefix 0x8E,offset by +0x80.
    plan,ku,ten = kuten.split('-')
    #  get (Raw) JIS  ↓↓↓↓↓↓
    euc0 = ( int( ku) + 0x20 ) | 0x80
    euc1 = ( int(ten) + 0x20 ) | 0x80
    #  turn on bit-8 (MSB)     ↑↑↑↑↑↑
    if plan == '1':
        #  0x{A1..FE}{A1..FE}: JISX0213 plane 1,offset by +0x8080.
        euc = bytearray([euc0,euc1]).decode('euc_jisx0213','replace')
    else:
        # 0x8F{A1..FE}{A1..FE}: JISX0213 plane 2,with prefix 0x8F,offset by +0x8080.
        euc = bytearray([0x8f,euc0,'replace')
    print( kuten,euc,repr(euc.encode('euc_jisx0213','backslashreplace')).ljust(15),repr(euc.encode('unicode-escape',euc.encode('utf-8','backslashreplace'))

请注意我的日语零技能。上面的代码段基于以下资源:

0x00..0x7F:ASCII

0x8E{A1..FE}:JISX0201片假名,前缀为0x8E,偏移+ 0x80。

0x8F{A1..FE}{A1..FE}:JISX0213平面2,前缀0x8F,偏移+ 0x8080。

0x{A1..FE}{A1..FE}:JISX0213平面1,偏移+ 0x8080。

给定示例数据的

输出.\SO\64486353a.py

1-14-02 ? b'\xae\xa2'     b'\\U0002000b'  b'\xf0\xa0\x80\x8b'
1-16-01 亜 b'\xb0\xa1'     b'\\u4e9c'      b'\xe4\xba\x9c'
2-01-02 丂 b'\x8f\xa1\xa2' b'\\u4e02'      b'\xe4\xb8\x82'
1-19-34 蛎 b'\xb3\xc2'     b'\\u86ce'      b'\xe8\x9b\x8e'
1-19-56 学 b'\xb3\xd8'     b'\\u5b66'      b'\xe5\xad\xa6'
1-19-57 岳 b'\xb3\xd9'     b'\\u5cb3'      b'\xe5\xb2\xb3'
1-19-58 楽 b'\xb3\xda'     b'\\u697d'      b'\xe6\xa5\xbd'
1-60-59 樂 b'\xdc\xdb'     b'\\u6a02'      b'\xe6\xa8\x82'
1-53-60 學 b'\xd5\xdc'     b'\\u5b78'      b'\xe5\xad\xb8'
1-53-61 斈 b'\xd5\xdd'     b'\\u6588'      b'\xe6\x96\x88'
1-33-55 宋 b'\xc1\xd7'     b'\\u5b8b'      b'\xe5\xae\x8b'
2-05-05 ? b'\x8f\xa5\xa5' b'\\U000213c4'  b'\xf0\xa1\x8f\x84'