Windows控制台至少可以识别十年,并且可能早在Windows NT上.但是由于某些原因,主要的跨平台脚本语言(包括Perl和Python)只输出各种8位编码,因此需要很多麻烦才能解决.Perl给出了"打印中的宽字符"警告,Python给出了一个charmap错误并退出.为什么在这么多年之后它们不仅仅是简单地调用输出UTF-16 Unicode的Win32 -W API而不是通过ANSI /代码页瓶颈强制一切?
仅仅是跨平台性能是低优先级吗?这些语言是否在内部使用UTF-8并且发现输出UTF-16太麻烦了?或者-WAP本身是否破坏到不能按原样使用的程度?
UPDATE
似乎责任可能需要各方共同承担责任.我想象脚本语言只能wprintf在Windows上调用,让操作系统/运行时担心重定向等问题.但事实证明,即使是Windows上的wprintf,也会在打印到控制台之前将宽字符转换为ANSI并返回!
如果这个问题已得到解决,请告诉我,因为错误报告链接似乎已损坏但我的Visual C测试代码仍然无法用于wprintf并成功用于WriteConsoleW.
更新2
实际上,您可以使用C语言将UTF-16打印到控制台,wprintf但前提是这样做_setmode(_fileno(stdout), _O_U16TEXT).
从C你可以将UTF-8打印到一个控制台,其代码页设置为代码页65001,但Perl,Python,PHP和Ruby都有防止这种情况的错误.Perl和PHP通过在包含至少一个宽字符的行之后添加额外的空行来破坏输出.Ruby的损坏输出略有不同.Python崩溃了.
更新3
Node.js是第一个没有出现此问题的脚本语言.
Python开发团队慢慢意识到这是一个真正的问题,因为它是在2007年底首次报道的,并且已经看到了大量的活动,以完全理解并完全修复2016年的错误.
我简化了我的代码以便更好地理解.这是问题所在:
情况1:
# -*- coding: utf-8 -*-
text = "??? ??? ???????" # also using u"...." results the same
print(text)
Run Code Online (Sandbox Code Playgroud)
输出:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
案例2:
text = "??? ??? ???????".encode("utf-8")
print(text)
Run Code Online (Sandbox Code Playgroud)
没有输出.
案例 3:
import sys
text = "??? ??? ???????".encode("utf-8")
sys.stdout.buffer.write(text)
Run Code Online (Sandbox Code Playgroud)
输出:
??? ??? ???????
Run Code Online (Sandbox Code Playgroud)
我知道案例3以某种方式工作,但我想使用其他函数,如print(),write(str()),....
我也读蟒蛇3关于为Unicode文件在这里.
并且还在stackoverflow中阅读了几十个问答.
而这里是一个很长的文章解释蟒蛇2.X的问题和答案
简单的问题是:
如何使用python print()函数打印波斯语或阿拉伯语等非ASCII字符?
更新1:正如许多人建议的那样,问题与我测试案例的终端有关:
案例4:
text = "??? ??? ???????" .encode("utf-8")# also using u"...." results the …Run Code Online (Sandbox Code Playgroud) 我使用的是Python 2.7.我从utf-8编码的文本文件中获得以下行(字符串):
"???? ???? ?????? ?????? ????? ?????? ????? ???? ??? ?????? ?? ??? ?? ?? ?? ????"
Run Code Online (Sandbox Code Playgroud)
我使用以下代码在屏幕上打印它:
import codecs
filename = codecs.open('file path', 'r', encoding="utf-8")
outputfile = filename.readlines()
print outputfile
Run Code Online (Sandbox Code Playgroud)
它给出了以下输出:
[u'\ufeff\u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u062e\u0628\u0631\u0648\u06ba\u060c \u0628\u0631\u06cc\u06a9\u0646\u06af \u0646\u06cc\u0648\u0632\u060c \u0648\u06cc\u0688\u06cc\u0648\u060c \u0622\u0688\u06cc\u0648\u060c \u0641\u06cc\u0686\u0631 \u0627\u0648\u0631 \u062a\u062c\u0632\u06cc\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06cc \u0628\u06cc \u0633\u06cc \u0627\u0631\u062f\u0648 \u06a9\u06cc \u0648\u06cc\u0628']
Run Code Online (Sandbox Code Playgroud)
目的是正确打印文本,而不是如何打印每一行.那么,如何以原始形式正确打印文本文件的字符串或内容?喜欢:
???? ???? ?????? ?????? ????? ?????? ????? ???? ??? ?????? ?? ??? ?? ?? ?? ????
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Python中打印出以下请求(使用请求模块):
r = requests.get("http://www.youtube.com",
params={
"search_query": "test"
}).text
Run Code Online (Sandbox Code Playgroud)
但是,在打印时,我收到以下错误:
UnicodeEncodeError:'charmap'编解码器不能编码位置32891-32894中的字符:字符映射到
<undefined>
我确定这不是模块本身,因为基于一些谷歌搜索似乎没有其他事件发生,并且它正在与我尝试的其他请求一起工作.似乎只有这个请求无法打印.
有谁知道如何打印它?
编辑:现在我真的很困惑:这个程序对我来说只运行了一次,并且自那次出现之后就没有工作过一次.