在Python中将JIS X 208代码转换为UTF-8

在Python中将JIS X 208代码转换为UTF-8,python,encoding,standards,data-conversion,Python,Encoding,Standards,Data Conversion,假设我有这个汉字亜 在JIS X 208代码中以十六进制形式表示:0x3021。我希望我的Python程序将该代码转换为UTF-8格式的E4BA9C,这样我就可以像这样将编码的字符串URL传递到我的URL中 我使用的是Python2.7.12,但我也对Python3解决方案持开放态度这些都是在ISO 2022编解码器下访问的 >>> '亜'.encode('iso2022_jp') b'\x1b$B0!\x1b(B' 如果我看到这些字节没有被转义序列框起来,我就必须知道使用的

假设我有这个汉字亜 在JIS X 208代码中以十六进制形式表示:0x3021。我希望我的Python程序将该代码转换为UTF-8格式的E4BA9C,这样我就可以像这样将编码的字符串URL传递到我的URL中


我使用的是Python2.7.12,但我也对Python3解决方案持开放态度

这些都是在ISO 2022编解码器下访问的

>>> '亜'.encode('iso2022_jp')
b'\x1b$B0!\x1b(B'
如果我看到这些字节没有被转义序列框起来,我就必须知道使用的是哪个版本的JIS X 0208,但我现在在维基百科上完全是模式匹配

>>> b = b'\033$B' + bytes.fromhex('3021')
>>> c = b.decode('iso2022_jp')
>>> c
'亜'
>>> urllib.parse.quote(c)
'%E4%BA%9C'

这是Python3。

此解决方案可能不是标准的,但似乎可以工作

密码 参考 标准编码: JIS表格:
谢谢你的解决方案。我想知道你是否也能提供Python 2解决方案。我也不太明白你是如何得到序列b'\033$b的。这个序列是这个例子特有的,还是你能把它用于其他JIS X 208代码中呢?这就是Python在我要求在iso2022_jp中编码时给出的结果,更多内容在
import urllib.parse


def jis_to_euc_jp(jis_hex: str):
    """
    You can find the rules from this website: https://pentan.info/doc/jis_list.html

    8080 = A1A1 - 2121
    4B8080 = 8FA1C1 - 442141
    """
    int_jis = int(jis_hex, 16)
    step = int('8080', 16) if int_jis <= int('7426', 16) else int('4B8080', 16)
    return hex(int_jis + step).upper()[2:]  # 0X3021 -> 3021


def eucjp_to_utf_16be(eucjp_hex: str):
    byte_ch = bytes.fromhex(eucjp_hex)
    real_char = byte_ch.decode('euc_jp')  # '亜'
    # code = real_str.encode('utf-8').hex().upper()  # E4BA9C
    return real_char


def main():
    for v in ['亜'.encode('utf-8').hex().upper(),  # when glyph is know. E4BA9C

              # only know jis code, to find the real char
              jis_to_euc_jp('3021'),  # B0A1  # the Standard Encodings is provided euc-jp turn to utf-16be, so we need to know the relation between JIS and euc-jp
              eucjp_to_utf_16be(jis_to_euc_jp('3021'))
              ]:
        print(urllib.parse.quote(v))


if __name__ == '__main__':
    main()

E4BA9C
B0A1
%E4%BA%9C