栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 面试经验 > 面试问答

为什么无法转换为utf8?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么无法转换为utf8?

您已经将Unipre与UTF-8混淆了。Latin-1是Unipre的子集,但不是UTF-8的子集。 避免像瘟疫一样思考各个代码单元。
只需使用代码点即可。不要考虑UTF-8。考虑一下Unipre。这是您感到困惑的地方。

演示程序的源代码

在Python中使用Unipre非常容易。特别是在Python
3和广泛的版本中,这是我使用Python的唯一方式,但是如果您小心翼翼地坚持使用UTF-8,仍然可以在狭窄的版本中使用旧版Python 2。

为此,请始终将您的源代码编码和输出编码正确地转换为UTF-8。现在,不要再考虑UTF了,而在整个Python程序中仅使用UTF-8文字,逻辑代码点号或符号字符名称。

这是带有行号的源代码:

% cat -n /tmp/py     1  #!/usr/bin/env python3.2     2  # -*- coding: UTF-8 -*-     3       4  from __future__ import unipre_literals     5  from __future__ import print_function     6       7  import sys     8  import os     9  import re    10      11  if not (("PYTHONIOENCODING" in os.environ)    12   and    13          re.search("^utf-?8$", os.environ["PYTHONIOENCODING"], re.I)):    14      sys.stderr.write(sys.argv[0] + ": Please set your PYTHonIOENCODING envariable to utf8n")    15      sys.exit(1)    16      17  print('1a: el nixF1o')    18  print('2a: el ninu0303o')    19      20  print('1a: el niño')    21  print('2b: el niño')    22      23  print('1c: el niN{LATIN SMALL LETTER N WITH TILDE}o')    24  print('2c: el ninN{COMBINING TILDE}o')

以下是带有非ASCII字符且使用

x{⋯}
符号单引号的打印功能:

% grep -n ^print /tmp/py | uniquote -x17:print('1a: el nixF1o')18:print('2a: el ninu0303o')20:print('1b: el nix{F1}o')21:print('2b: el ninx{303}o')23:print('1c: el niN{LATIN SMALL LETTER N WITH TILDE}o')24:print('2c: el ninN{COMBINING TILDE}o')

演示程序样本运行

这是该程序的示例运行,显示了执行该操作的三种不同方式(a,b和c):第一种设置为源代码中的文字(将受StackOverflow的NFC转换约束,因此不可信任!!)
!)和后两个集合分别具有 数字Unipre代码点符号Unipre字符名称
,它们再次被单引号括起来,因此您可以看到真正的含义:

% python /tmp/py1a: el niño2a: el niño1b: el niño2b: el niño1c: el niño2c: el niño% python /tmp/py | uniquote -x1a: el nix{F1}o2a: el ninx{303}o1b: el nix{F1}o2b: el ninx{303}o1c: el nix{F1}o2c: el ninx{303}o% python /tmp/py | uniquote -v1a: el niN{LATIN SMALL LETTER N WITH TILDE}o2a: el ninN{COMBINING TILDE}o1b: el niN{LATIN SMALL LETTER N WITH TILDE}o2b: el ninN{COMBINING TILDE}o1c: el niN{LATIN SMALL LETTER N WITH TILDE}o2c: el ninN{COMBINING TILDE}o

我真的不喜欢二进制文件,但这是二进制字节的样子:

% python /tmp/py | uniquote -b1a: el nixC3xB1o2a: el ninxCCx83o1b: el nixC3xB1o2b: el ninxCCx83o1c: el nixC3xB1o2c: el ninxCCx83o

这个故事的主旨

即使使用UTF-8源码,也应该仅考虑和使用逻辑Unipre代码点编号(或符号命名字符),而不要使用作为UTF-8串行表示基础的单个8位代码单元(或就此而言)
UTF-16)。很少需要代码单位而不是代码点,这只会使您感到困惑。

如果使用广泛的Python3版本,您将获得比其他选择更可靠的行为,但这是UTF-32问题,而不是UTF-8问题。如果您顺其自然,那么UTF-32和UTF-8都易于使用。



转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/640215.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号