Python 中的 UTF-32

Posted

技术标签:

【中文标题】Python 中的 UTF-32【英文标题】:UTF-32 in Python 【发布时间】:2012-09-22 18:46:12 【问题描述】:

我无法显示 unicode 项 u'\u201d'。我对其他 unicode 项目没有问题。我使用了 UTF-8,但随后这个字符出现并在我的代码上下雨了。我在解释器中尝试了不同的东西。但基本上在哪里:

c = u'\u201d'

我收到此错误:

Traceback (most recent call last):
File "<pyshell#154>", line 1, in <module>
    c.decode('utf-32')
  File "C:\Python27\lib\encodings\utf_32.py", line 11, in decode
    return codecs.utf_32_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u201d' in position 0: ordinal not in range(128)

我需要在 GUI 中显示它,以便检查输出,然后将其存储为纯文本。 Transform unicode string in python 解释了一下,但是我仍然明显遗漏了一些东西。

【问题讨论】:

c.decode('utf-32')中的c是什么? 我提到的值 u'\u201d' 所以这个问题与 2 小时前你自己提出的问题 ***.com/questions/12545843/… 完全相同。 是的,cmets 中的一个人说它跑题了并要求重新发布....我现在对此感到非常沮丧,所以我最终这样做了,一旦我解决了这个问题,我将至少删除有用的 您还没有定义“GUI”的含义,也没有告诉我们哪个 OS+应用程序将打开生成的文本文件。他们都有所不同。 【参考方案1】:

如果您遇到此异常,则表示您尝试在 unicode 字符串上调用 .decode()。您应该只在字节字符串上调用 .decode(),并且只在 unicode 字符串上调用 .encode()。否则,解释器将首先使用默认编解码器(通常是'ascii')隐式编码或解码字符串,这是个坏消息。

总的来说,我建议仔细阅读http://farmdev.com/talks/unicode/...

【讨论】:

如果我编码 u'\u201d'.encode('utf-32') 我得到: '\xff\xfe\x00\x00\x1d \x00\x00' 我需要转换那个符号转换为 GUI 的纯文本并将其保存为 txt 定义“纯文本”。在这种情况下,没有“纯文本”之类的东西。我建议阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets 我已阅读该文件,它很有用,但我仍然对如何解决我的问题感到困惑。我所需要的只是将任何人类不可读的内容转换为可读格式,这样我就可以在某些条件下对其进行测试,然后将其写入文件。在任何意义上,我都不是专业的编码员。我只需要干净的输出,仅此而已【参考方案2】:

如果你读过The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),你就会知道没有纯文本这样的东西..

但是,由于您坚持追求的内容与人们试图解释的内容之间似乎没有达成一致意见,我开始怀疑是否通过“将该符号转换为纯文本”您意思是“用引号(U + 0022)替换Unicode右双引号(U + 201D),然后编码为ASCII”。例如,类似:

In [45]: s = u"“curly quoted”"

In [46]: s
Out[46]: u'\u201ccurly quoted\u201d'

In [47]: print s
“curly quoted”

然后手动进行替换(搜索“unicode string sanitize”,您会发现更好的配方,包括针对不同字符的更多“降级”):

In [51]: fixer = dict.fromkeys([0x201c, 0x201d], u'"')

In [52]: s.translate(fixer)
Out[52]: u'"curly quoted"'

In [53]: s.translate(fixer).encode("ascii", "replace")
Out[53]: '"curly quoted"' 

“替换”可以防止任何我们没有修复的东西。

【讨论】:

以上是关于Python 中的 UTF-32的主要内容,如果未能解决你的问题,请参考以下文章

细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

使用Javascript中的utf-32编码缩短utf-8字符串?

细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

将NSString转换为UTF32和从UTF32转换

C# 中没有 UTF-32 big-endian?