帮助我了解为什么Unicode有时只能与Python一起使用

帮助我了解为什么Unicode有时只能与Python一起使用,第1张

帮助我了解为什么Unicode有时只能与Python一起使用

Python(和大多数其他语言)中的I / O基于 bytes
。当您将字节字符串

str
在2.x中,
bytes
在3.x中)写入文件时,字节只是按原样写入。当您将Unipre字符串(
unipre
在2.x,
str
3.x中)写入文件时,需要将数据
编码 为字节序列。

有关此区别的进一步说明,请参见“ 深入Python 3”
一章中的字符串。

print('abcd kΩ ☠ °C √Hz µF ü ☃ ♥')

在此,字符串是字节字符串。由于源文件的编码为UTF-8,因此字节为

'abcd kxcexa9 xe2x98xa0 xc2xb0C xe2x88x9aHz xc2xb5F xc3xbc xe2x98x83 xe2x99xa5'

print
语句将这些字节原样写入控制台。但是Windows控制台将字节字符串解释为在“
OEM”代码页(在美国为437)中编码。因此,您实际在屏幕上看到的字符串是

abcd kΩ ☠ °C √Hz µF ü ☃ ♥

在您的Ubuntu系统上,这不会造成问题,因为默认的控制台编码是UTF-8,因此您在源文件编码和控制台编码之间没有差异。

print(u'abcd kΩ ☠ °C √Hz µF ü ☃ ♥')

打印Unipre字符串时,必须将字符串 编码 为字节。但是,只有在您的编码支持这些字符的情况下,它才有效。而你没有。

  • 缺省的IBM437编码缺少字符
    ☠☃♥
  • Spyder使用的Windows-1252编码缺少字符
    Ω☠√☃♥

因此,在两种情况下,您都会收到一个UnipreEnpreError尝试打印字符串。

是什么赋予了?

Windows和Linux采用了截然不同的方法来支持Unipre。

最初,它们的工作方式几乎相同:每个语言环境都有自己的

char
基于特定语言的编码(Windows中为“
ANSI代码页”)。西方语言使用ISO-8859-1或Windows-1252,俄语使用KOI8-R或Windows-1251等。

当Windows
NT添加了对Unipre的支持时(即早先假定Unipre将使用16位字符),它通过创建其API的并行版本(

wchar_t
而不是)来实现
char
。例如,MessageBox函数被拆分为两个函数:

int MessageBoxA(HWND hWnd, const char* lpText, const char* lpCaption, unsigned int uType);int MessageBoxW(HWND hWnd, const wchar_t* lpText, const wchar_t* lpCaption, unsigned int uType);

“ W”功能是“真实”功能。存在“
A”函数是为了与基于DOS的Windows向后兼容,并且大多数情况下只是将其字符串参数转换为UTF-16,然后调用相应的“ W”函数。

在Unix世界(特别是Plan 9)中,编写一个全新版本的POSIX
API被认为是不切实际的,因此以不同的方式获得了Unipre支持。使用CJK语言环境中对多字节编码的现有支持来实现现在称为UTF-8的新编码。

在编写支持Unipre的跨平台代码时,在类Unix系统上对UTF-8的偏爱以及在Windows上对UTF-16的偏爱是一个巨大的痛苦。Python试图向程序员隐藏此内容,但打印到控制台是Joel的“泄漏抽象”之一。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5655271.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存