【问题标题】:Is there any function like iconv in Python?Python中有没有像iconv这样的函数?
【发布时间】:2015-06-05 08:44:57
【问题描述】:

我有一些 CSV 文件需要从 shift-jis 转换为 utf-8。

这是我的 PHP 代码,成功转码为可读文本。

$str = utf8_decode($str);
$str = iconv('shift-jis', 'utf-8'. '//TRANSLIT', $str);
echo $str;

我的问题是如何在 Python 中做同样的事情。

【问题讨论】:

  • utf8_decode 在 Shift-JIS 编码的字符串上?!这没有任何意义。

标签: python encoding


【解决方案1】:

我不知道 PHP,但是这行得通吗:

mystring.decode('shift-jis').encode('utf-8') ?

我还假设 CSV 内容来自文件。在 python 中打开文件有几个选项。

with open(myfile, 'rb') as fin

将是第一个,您将按原样获取数据

with open(myfile, 'r') as fin

将是默认文件打开方式

我还尝试使用 shift-js 文本计算我的计算,并且以下代码有效:

with open("shift.txt" , "rb") as  fin :
    text = fin.read()

text.decode('shift-jis').encode('utf-8')

UTF-8 中的结果如下(没有任何错误)

' \xe3\x81\xa6 \xe3\x81\xa7 \xe3\x81\xa8'

好的,我验证我的解决方案:)

第一个字符确实是好字符:“\xe3\x81\xa6”表示“E3 81 A6” 它给出了正确的结果。

你可以在这个URL试试自己

【讨论】:

  • 谢谢。我已经尝试过了,但我不知道如何解决这个错误。 UnicodeEncodeError: 'shift_jis' codec can't encode character u'\x83' in position 191: 非法多字节序列如果我添加了text.replace(u'\x83', u'\'') UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 191: ordinal not in range( 128)
  • 非常感谢您的有用回复。最后我发现了问题,CSV文件在shift-jis到utf-8之前需要utf-8解码。所以mystring.decode('shift-jis').encode('utf-8') 对我来说是工作。再次感谢。 :)
  • 我意识到是源文件问题。这是我的解决方案。 text = text.decode('utf-8').encode('iso-8859-1')text = text.decode('shift-jis').encode('utf-8')
  • 这个答案适用于在编码之间转换字符串,但 iconv 还可以做更多的事情,例如,您可以使用它来音译字符,正如 OP 所要求的那样。 //TRANSLIT 将导致目标编码无法表示的字符被有意义的东西替换。
【解决方案2】:

当 python 的内置编码不足时,PyPi 上有一个 iconv

pip install iconv

不幸的是,文档不存在。

还有iconv_codecs

pip install iconv_codecs

例如:

>>> import iconv_codecs
>>> iconv_codecs.register('ansi_x3.110-1983')
>>> "foo".encode('ansi_x3.110-1983')

【讨论】:

    【解决方案3】:

    如果您可以发布您尝试转换的字符串会很有帮助,因为此错误表明数据中存在一些问题,旧版本的 PHP 在输入字符串损坏时静默失败,这使得这很难诊断。

    根据documentation,这也可能是由于 shift-jis 方言的差异,请尝试改用“shift_jisx0213”或“shift_jis_2004”。

    如果使用其他方言不起作用,您可以通过使用 .decode('shift-jis','ignore').decode('shift-jis','replace') 让 python 静默失败。

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      相关资源
      最近更新 更多