本篇文章给大家谈谈如何获得Python中组合Unicode字符串的“可见”长度?,以及python获取unicode编码的知识点,同时本文还将给你拓展PythonUnicode字符串和Python交互
本篇文章给大家谈谈如何获得Python中组合Unicode字符串的“可见”长度?,以及python 获取unicode编码的知识点,同时本文还将给你拓展Python Unicode字符串和Python交互式解释器、python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法、python中将字符串转换为unicode字节码形式、python入门一(变量和数据类型)【1-7 python中Unicode字符串】等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- 如何获得Python中组合Unicode字符串的“可见”长度?(python 获取unicode编码)
- Python Unicode字符串和Python交互式解释器
- python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法
- python中将字符串转换为unicode字节码形式
- python入门一(变量和数据类型)【1-7 python中Unicode字符串】
如何获得Python中组合Unicode字符串的“可见”长度?(python 获取unicode编码)
如果我有一个包含组合字符的Python Unicode字符串,则len
报告一个值,该值与“已看到”的字符数不对应。
例如,如果我有一个包含上划线和下划线的字符串,例如u''A\u0332\u0305BC''
,len(u''A\u0332\u0305BC'')
报告5;但是显示的字符串只有3个字符长。
如何获得“可见的”(即用户看到的字符串所占据的不同位置的数量)Unicode字符串的长度,该字符串包含Python中的组合字形?
答案1
小编典典该unicodedata
模块具有combining
可用于确定单个字符是否为组合字符的功能。如果返回0
,则可以将该字符视为非组合字符。
import unicodedatalen(u''''.join(ch for ch in u''A\u0332\u0305BC'' if unicodedata.combining(ch) == 0))
或者,稍微简单一点:
sum(1 for ch in u''A\u0332\u0305BC'' if unicodedata.combining(ch) == 0)
Python Unicode字符串和Python交互式解释器
我试图了解python
2.5如何处理unicode字符串。尽管到目前为止,我认为我已经很好地理解了如何在代码中处理它们,但是我还不完全了解幕后的情况,尤其是当您在解释程序的提示符下键入字符串时。
因此python pre
3.0有两种字符串类型,即:(str
字节字符串)和unicode
,这两种类型均源自basestring
。字符串的默认类型是str
。
str
对象没有实际编码的概念,它们只是字节。您是自己编码了unicode字符串,因此知道了它们的编码方式,或者您已经读取了一个字节流,而这些字节的编码您也已经事先知道(理想情况下)。您可以猜测一个字节字符串的编码,该字节字符串的编码对您来说是未知的,但是没有一种可靠的方法可以解决此问题。最好的选择是尽早解码,在代码中的任何地方使用unicode,然后再进行后期编码。
没关系。但是,键入解释器的字符串确实是为您背后编码的吗?如果我对Python中的字符串的理解是正确的,那么python用于做出此决定的方法/设置是什么?
我困惑的根源是在系统的python安装和编辑器的嵌入式python控制台上尝试相同的操作时得到的结果不同。
# Editor (Sublime Text) >>> s = "La caña de España" >>> s ''La ca\xc3\xb1a de Espa\xc3\xb1a'' >>> s.decode("utf-8") u''La ca\xf1a de Espa\xf1a'' >>> sys.getdefaultencoding() ''ascii'' # Windows python interpreter >>> s= "La caña de España" >>> s ''La ca\xa4a de Espa\xa4a'' >>> s.decode("utf-8") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: ''utf8'' codec can''t decode byte 0xa4 in position 5: unexpected code byte >>> sys.getdefaultencoding() ''ascii''
答案1
小编典典让我扩展一下Ignacio的回答:在这两种情况下,Python和您之间都有一个额外的层:一种情况是 Sublime Text
,另一种情况是cmd.exe
。您看到的行为差异不是由于Python引起的,而是由于 Sublime Text
(看起来是utf-8)和cmd.exe
(cp437)使用的不同编码。
因此,当您输入时ñ
, Sublime Text
发送''\xc3\xb1''
到Python,而cmd.exe
sends发送\xa4
。[我只是在这里讨价还价,省略了与问题无关的细节。]
不过,Python知道这一点。从cmd.exe
您可能会得到类似:
>>> import sys>>> sys.stdin.encoding''cp437''
而在 Sublime Text中, 您会得到类似
>>> import sys>>> sys.stdin.encoding''utf-8''
python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法
今天在进行django开发的过程中遇到了一个非常棘手的问题, 因为需求原因, 需要将一份数据存为json格式到数据库中, 如下面这种格式:
list_1 = [{"name":"lowman", "age":"18"},{"name":"lowman1", "age":None}]
开发环境是python2, 在后端接收到数据,打印数据是这样的:
[{u"name":u"lowman", u"age":u"18"},{u"name":u"lowman1", u"age":None}]
里面的所有的字符串元素都是unicode类型的, 如果不使用json.dumps()进行转换直接保存到数据库中(TextField),然后再取出,是这样格式的数据(编码后保存还是unicode类型, 数据库编码格式是utf-8)
u''[{u"name":u"lowman", u"age":u"18"},{u"name":u"lowman1", u"age":None}]''
这时如果使用json.loads()进行转换, 会抛出异常(使用json.loads(),元素不可以是unicode类型), 但是如果使用json.dumps()将数据进行一下转换,再保存到数据库中时,却是这样的数据形式
"[{u''name'':u''lowman'', u''age'':u''18''},{u''name'':u''lowman1'', u''age'':None}]"
这时使用json.loads()进行转换后,再使用django rest framework 的 Response() 向前端进行返回, 前端接收的数据却是这样的, 且无法转化为list数据
"[{u''name'':u''lowman'', u''age'':u''18''},{u''name'':u''lowman1'', u''age'':None}]"
各种求解无果,问题症结就在列表嵌套字典, 在我的环境里进行encode() 企图将数据转换为str格式的字符串时无法作用到里面的一层数据, 字典的元素仍然是unicode类型, 各种磨难寻找后, 终于发现了一个神器, 那就是eval() 函数, 它可以神奇的将最外层的数据的双引号或者单引号去掉, 转换为原始格式的数据, 并且可以将里面所有的unicode元素字符串转换为str格式的字符串
list_str = u''[{u"name":u"lowman", u"age":"18"},{u"name":u"lowman1", u"age":None}]''
list_str = eval(list_str)
print(type(list_str))
print(list_str)
my_str = "123"
my_str = eval(my_str)
print(type(my_str))
print(my_str)
输出结果
<class ''list''>
[{''name'': ''lowman'', ''age'': ''18''}, {''name'': ''lowman1'', ''age'': None}]
<class ''int''>
123
回到原来的需求:
先使用eval() 处理后端接收到的数据, 再使用json.dumps()进行处理, 然后保存到数据库, 数据形式是这样的(话说这样格式的数据其实才是满足我们本次需求的)
[{''name'': ''lowman'', ''age'': ''18''}, {''name'': ''lowman1'', ''age'': None}]
这时, 保存到数据库中的数据才是一个json格式的数据, 当想要向前端返回数据时, 使用json.loads() 或者仍然使用eval()函数进行处理一下从数据库中取出的数据, 再使用Django rest framework 的 Respose() 向前端进行返回.前端发送ajax请求成功后接收到数据格式是这样的(注意这时对应到Python字典数据的键是没有引号的):
[{name: ''lowman'', age: ''18''}, {name: ''lowman1'', age: None}]
至此,问题解决, eval 果然神奇......................................................................
经过一位大佬的提醒,这样子使用 eval 函数,是存在安全性问题的(比如数据中存在脚本代码,或者 sql 语句),事实上 eval 是一个非常强大的函数,它具备了很多实用的功能,但是如果对于数据源不具备可信任性,可以使用 ast.literal_eval 进行替代,特别是在进行 web server 开发时,需要接收处理前端传递的参数。。。
python中将字符串转换为unicode字节码形式
>>> u''已经在工作了,部署时间''.encode(''unicode_escape'')
b''\\u5df2\\u7ecf\\u5728\\u5de5\\u4f5c\\u4e86\\uff0c\\u90e8\\u7f72\\u65f6\\u95f4''
函数是str.encode()
,但主要跟参数有关
见https://docs.python.org/3/library/codecs.html#text-encodings
之后可以用str.replace()
之类的函数把反斜杠替换掉
python入门一(变量和数据类型)【1-7 python中Unicode字符串】
1-7 python中Unicode字符串
字符串还有一个编码问题。
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是65,小写字母 z 的编码是122。
如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。
因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码,普通的字符串''ABC''在Python内部都是ASCII编码的。
Python在后来添加了对Unicode的支持,以Unicode表示的字符串用u''...''表示,比如:
1 print u''中文''
2 中文
注意: 不加 u ,中文就不能正常显示。
Unicode字符串除了多了一个 u
之外,与普通字符串没啥区别,转义字符和多行表示法仍然有效:
转义:
1 u''中文\n日文\n韩文''
多行:
1 u''''''第一行
2 第二行''''''
raw+多行:
1 ur''''''Python的Unicode字符串支持"中文",
2 "日文",
3 "韩文"等多种语言''''''
我们今天的关于如何获得Python中组合Unicode字符串的“可见”长度?和python 获取unicode编码的分享已经告一段落,感谢您的关注,如果您想了解更多关于Python Unicode字符串和Python交互式解释器、python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法、python中将字符串转换为unicode字节码形式、python入门一(变量和数据类型)【1-7 python中Unicode字符串】的相关信息,请在本站查询。
本文标签: