簡體   English   中英

如何在 Windows 的 Python 中打印 ê 和其他特殊字符在 ascii 中可用

[英]How to print ê and other special characters available in ascii in Python for windows

我想在 Python 中為 Windows 打印 ê。 當我在 DOS 提示符下時,我可以輸入 alt+136 來獲得ê 字符。 為什么是這樣?

print(chr(136))在代碼頁 cp437 下正確打印 ê,但是如何打開帶有這些字符的 unicode 文件:

Sokal’, L’vivs’ka Oblastâ€
BucureÅŸti, Romania
ง'⌣'

並讓它打印這些字符而不是下面的 gobbledygook:

>>> import codecs
>>> f = codecs.open("unicode.txt", "r", "utf-8")
>>> f.read()
u"Sokal\xe2\u20ac\u2122, L\xe2\u20ac\u2122vivs\xe2\u20ac\u2122ka Oblast\xe2\u20ac\nBucure\xc5\u0178ti, Romania\n\xe0\xb8\u2021'\
xe2\u0152\xa3'\nThis text should be in \xe2\u20ac\u0153quotes\xe2\u20ac\\x9d.\nBroken text… it’s ?ubberi?c!"

甚至更糟:

>>> f = codecs.open("unicode.txt", "r", "utf-8")
>>> print(f.read())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 6-7: character maps to <undefined>

下列

import codecs
f = codecs.open("unicode.txt", "r", "utf-8")
s = f.read()
print(s.encode('utf8'))

印刷

Sokal’, L’vivs’ka Oblastâ€
BucureÅŸti, Romania
ง'⌣'
This text should be in “quotesâ€\x9d.
Broken text&hellip; it&#x2019;s ?ubberi?c!

代替

Sokal’, L’vivs’ka Oblastâ€
BucureÅŸti, Romania
ง'⌣'

我正在使用:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32

是否有某種方法可以替換 unicode 字符串中的 ê 等,而是成為 ê aka chr(136)的可打印 ascii 版本?

請注意,我的問題涉及如何基於原始 UTF-8 unicode 創建新的非 Unicode 擴展 ascii 字符串,如果有等效字符可用,該字符串會將不可打印字符更改為 ascii 代碼頁中的字符,或者用 ? 替換字符或類似的東西,如果有等價物可用。

我看到多個問題,您偶然發現了幾個常見的 Unicode 問題:

  • 如何輸入ê -- Alt+136 應該適用於cp437 cp1252嘗試 Alt+234(未測試)

     >>> u'ê'.encode('cp437') b'\\x88' >>> int('88', 16) 136 >>> u'ê'.encode('cp1252') b'\\xea' >>> int('ea', 16) 234
  • 如何在 Python 中將 Unicode 打印到 Windows 控制台? 如何修復UnicodeEncodeError: 'charmap' ...異常? --按照鏈接

  • 如果您從文件中讀取文本,為什么會得到mojibake -- 不要從文件中打印字節,首先轉換為 Unicode: io.open('unicode.txt', encoding=encoding).read()
  • 為什么 Python 控制台顯示u'\€'而不是 反過來,如何僅使用 ascii 可打印字符顯示ê Unicode 字符,例如u'\\xea' -- Python REPL 使用sys.displayhook() (可定制)函數來顯示 Python 表達式的結果。 它調用repr()例如:

     >>> print u'ê' ê >>> print repr(u'ê') u'\\xea' >>> u'ê' u'\\xea'

    u'\\xea'是相應 Unicode 字符串的文本表示。 您可以將其用作 Unicode 字符串文字,以在 Python 源代碼中創建字符串。

在您的情況下可能沒有必要,但通常在 Windows 控制台中輸入/顯示任意 Unicode 字符,您可以安裝win-unicode-console package


無關: print(chr(136))不正確。 如果環境使用與您的字符編碼不兼容的字符編碼,則會產生錯誤的輸出,例如:

>>> print chr(136)
�

改為打印 Unicode:

>>> print unichr(234)
ê

原因是chr()在 Python 2 上返回一個字節串。同一個字節可能代表不同字符編碼中的不同字符,這就是為什么在處理文本時應該始終使用 Unicode。

您在閱讀時從 utf8 解碼它,因此您在編寫時需要對其進行編碼(回到 utf8 或其他一些編解碼器)

import codecs
f = codecs.open("unicode.txt", "r", "utf-8")
s = f.read()
print(s.encode('utf8'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM