问题描述
我正在尝试使用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'))
请注意我的日语零技能。上面的代码段基于以下资源:
- EUC-JP encoding: JIS X 0201 , JIS X 0208 和 JIS X 0212 字符集的编码方式(表)和 JIS X 0213 注释,
- The structure of EUC-JISX0213:
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。
- Jim Breen's CODING.INF-如何从 kuten代码(或 nhotta 的Kuten code to Unicode)计算 EUC编码
输出:.\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'