【问题标题】:How to print non-ascii characters to file in Python 2.7如何在 Python 2.7 中将非 ascii 字符打印到文件中
【发布时间】:2013-03-29 23:41:55
【问题描述】:

我试图通过更改字符代码来混淆一些 javascript,但我发现在 Python 2.7 中我无法正确打印超出特定范围的字符。

例如,这是我想要做的:

f = open('text.txt','w')
f.write(unichr(510).encode('utf-8'))
f.close()

我不能写 unichr(510),因为它说 ascii 编解码器超出范围。所以我用utf-8对其进行编码。这会将单个字符 u'\u01fe' 转换为两个 '\xc7\xbe'

现在,在 javascript 中,很容易获得字符代码 510 的符号:

String.fromCharCode(510)

给出单个字符:Ǿ

我用 Python 得到的是两个字符:Ǿ

如果我将这些字符传递给 javascript,我将无法检索原始单个字符。

我知道可以在 python 中打印 Ǿ 字符,但我一直无法弄清楚。我已经使用 unichr() 而不是 chr(),并将其编码为“utf-8”,但我仍然不够用。我还读到 Python 3 在 chr() 函数中内置了这个功能。但这对我没有帮助。

有谁知道我怎样才能完成这项任务?

谢谢。

【问题讨论】:

  • 如何将'\xc7\xbe' 传递给 JavaScript?这两个连续的字节(不要与字符 Ǿ 混淆)是 Ǿ 的 UTF-8 编码,JavaScript 应该这样识别(或者至少与 UTF-8 编码的 JS 文件中出现的 Ǿ 没有区别)。
  • 我将'\xc7\xbe' 保存到一个javascript 文件中。此外,它将其视为两个单独的字符。 @jwodder

标签: javascript python character-encoding special-characters


【解决方案1】:

你应该以二进制模式打开文件:

f = open('text.txt','wb')

然后写入字节(在 Python 3 中):

f.write(chr(510).encode('utf-8'))

或者在 Python 2 中:

f.write(unichr(510).encode('utf-8'))

最后,关闭文件

f.close()

或者您可以像这样以更好的方式做到这一点:

>>> f = open('e:\\text.txt','wt',encoding="utf-8")
>>> f.write(chr(510))
>>> f.close()

之后,您可以将文件读取为:

>>> f = open('e:\\text.txt','rb')
>>> content = f.read().decode('utf-8')
>>> content
'Ǿ'

或者

>>> f = open('e:\\text.txt','rt',encoding='utf-8')
>>> f.read()
'Ǿ'

在我的 Win7 和 Python3 上测试。它应该适用于 Python 2.X

【讨论】:

  • 似乎没有改变。仍然得到这两个字符。
  • 您应该告诉您的文本编辑器以 uft-8 编码打开它。但它与我的 Win7+Python3.3+notepad(或 UltraEdit)完美配合。
  • 看起来这可能是问题的解决方案。希望它能够轻松地移植到 javascript。谢谢!
  • 很高兴为您提供帮助。我刚刚在我的 Win7+Python2.7 上测试过。它也非常有效。你可以用记事本打开它来查看结果。可能是notepad++的问题。
【解决方案2】:

这个怎么样?

import codecs
outfile = codecs.open(r"C:\temp\unichr.txt", mode='w', encoding="utf-8")
outfile.write(unichr(510))
outfile.close()

【讨论】:

  • 这对我使用 python 2.7 非常有效,谢谢。
【解决方案3】:

Python 正在将字节 '\xc7\xbe' 写入文件:

In [45]: unichr(510).encode('utf-8')
Out[45]: '\xc7\xbe'

JavaScript 显然正在形成 unicode u'\xc7\xbe'

In [46]: 'Ǿ'.decode('utf-8')
Out[46]: u'\xc7\xbe'

In [47]: 'Ǿ'.decode('utf-8').encode('latin-1')
Out[47]: '\xc7\xbe'

问题在于 JavaScript 如何将字节转换为 unicode,而不是 Python 如何写入字节。

【讨论】:

  • 文件是javascript。我正在使用 for 循环解码 js,并使用以下内容调整每个字符: String.fromCharCode( l.charCodeAt(i) - 150 );
  • 另外,我可以通过查看文件看到 Python 在应该写一个字符的时候写了两个字符。
  • for 循环的目的是遍历每个字符,所以它是遍历每个字节,这不是我想要的。
  • 您希望将哪个单字节写入文件?选择范围必须从 '\x00''\xff'(256 个选项)。
  • 我不知道@unutbu。信不信由你,我不小心/不知何故用python打印了Ǿ,但不知道我是怎么做到的,我试图重复我的步骤无济于事。
猜你喜欢
  • 2021-11-29
  • 2011-04-04
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2017-08-11
  • 2021-05-21
相关资源
最近更新 更多