【问题标题】:get utf-8 character code given a shift-jis character code?在给定 shift-jis 字符代码的情况下获取 utf-8 字符代码?
【发布时间】:2012-02-24 18:08:12
【问题描述】:

在我的程序中,我将 shift-jis 字符代码作为 Python 整数,我需要将其转换为相应的 utf8 字符代码(也应该是整数)。 我怎样才能做到这一点? 对于 ASCII,您有有用的函数 ord()/chr(),它允许您将整数转换为 ASCII 字符串,稍后您可以轻松地将其转换为 unicode。对于其他编码,我找不到类似的东西。

使用 Python 2。

编辑:最终代码。谢谢大家:

def shift_jis2unicode(charcode): # charcode is an integer
    if charcode <= 0xFF:
        string = chr(charcode)
    else:
        string = chr(charcode >> 8) + chr(charcode & 0xFF)

    return ord(string.decode('shift-jis'))

print shift_jis2unicode(8140)

【问题讨论】:

  • 将它们作为整数而不是字节来获取是不寻常的——你可以改变吗?
  • 对不起,我不能。顺便说一句,我认为“字节”是 Python 3 中的新内容,我使用 2。
  • Python 2 str 像字节一样工作,它在 2.6 和 2.7 中有一个 bytes 别名。
  • 显示一些示例数据,让我们更好地了解您正在使用什么。
  • "str" 是一个内置类型。 “字符串”是一个内置模块。从技术上讲,您可以将它们用作变量名,但这很令人困惑。最好避开它们。

标签: python encoding utf-8 shift-jis


【解决方案1】:

没有“utf8 字符代码(也应该是整数)”这样的东西。

Unicode 定义了“代码点”,它们是整数。 UTF-8 定义了如何将这些代码点转换为字节数组。

所以我认为你想要 Unicode 代码点。在这种情况下:

def shift_jis2unicode(charcode): # charcode is an integer
    if charcode <= 0xFF:
        shift_jis_string = chr(charcode)
    else:
        shift_jis_string = chr(charcode >> 8) + chr(charcode & 0xFF)

    unicode_string = shift_jis_string.decode('shift-jis')

    assert len(unicode_string) == 1
    return ord(unicode_string)

print "U+%04X" % shift_jis2unicode(0x8144)
print "U+%04X" % shift_jis2unicode(0x51)

(另外:我认为 8100 不是有效的 shift-JIS 字符代码...)

【讨论】:

  • 8100 是一种猜测和错误的猜测。不要获得整个 unicode vs utf-8 业务。不过我认为你是对的。
  • @AlexC,Unicode 字符串由代码点组成(通常每个字符一个),ord 会将代码点转换为整数。 UTF-8 是 1 个或多个 8 位字节的代码点表示形式。
  • 对于 Unicode 和所有编码问题的良好介绍,我推荐“每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有借口!)”-joelonsoftware.com/articles/Unicode.html
【解决方案2】:

可能有更好的方法来做到这一点,但由于目前还没有其他答案,因此这里是一个选项。

您可以使用 this table 将 shift-jis 整数转换为 unicode 代码点,然后使用 unichr() 将您的数据转换为 Python unicode 对象,然后使用 unicode.encode('utf-8') 将其从 unicode 转换为 utf8。

【讨论】:

  • 谢谢。我已经在使用自定义表了。我想如果我可以使用 Python 提供的东西,代码会更简洁,我不需要额外的文件来保存所有字符代码。
【解决方案3】:
def from_shift_jis(seq):
    chars = [chr(c) if c <= 0xff else chr(c>>8) + chr(c&0xff) for c in seq]
    return ''.join(chars).decode('shift-jis')

utf8_output = [ord(c) for c in from_shift_jis(shift_jis_input).encode('utf-8')]

【讨论】:

  • "chr(c>>8) + chr(c&0xff)" 有什么作用?
  • @AlexC,c&gt;&gt;8 将整数的高 8 位移动到低 8 位,c&amp;0xff 去掉高 8 位。这是一种将整数分成两个 8 位部分的方法。如您所知,chr 转换为字符,+ 将它们附加到两个字符的字符串中。
  • 好的。我现在实际上将 unicode 字符串转换为 utf-8 字符代码整数时遇到了麻烦。我会用我目前的代码更新我的问题,请看一下。
  • @AlexC,我认为您希望在测试代码中使用 0x8100 而不是 8100
  • 我认为 0xFF 和 255 在 Python 中是完全相同的。仍然是一个错误。
猜你喜欢
  • 2016-09-06
  • 2014-05-02
  • 2013-12-15
  • 2010-09-28
  • 2021-05-29
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多