我在Django教程中偶然发现了这段话:
Django模型有一个默认的str()方法,它调用unicode()并将结果转换为UTF-8字节串.这意味着unicode(p)将返回一个Unicode字符串,str(p)将返回一个普通字符串,其字符编码为UTF-8.
现在,我很困惑,因为afaik Unicode不是任何特定的表示,那么Python中的"Unicode字符串"是什么?这是否意味着UCS-2?谷歌搜索出现了这个"Python Unicode教程",大胆地说明了这一点
Unicode是一种双字节编码,涵盖了世界上所有常见的书写系统.
这是完全错误的,还是它?我已经多次被字符集和编码问题搞糊涂了,但在这里我很确定我正在阅读的文档很混乱.当有人给我一个"Unicode字符串"时,是否有人知道Python中发生了什么?
我有两个包含日语单词和字符信息的python词典:
kanjiDic:包含汉字(单日语字符),键:汉字,值:字典及其相关信息
现在我想遍历vocabDic中每个单词的每个字符,并在汉字字典中查找这个字符.我的目标是创建一个csv文件,然后我可以将其作为词汇表和汉字的连接表导入数据库.
我的Python版本是2.6
我的代码如下:
kanjiVocabJoinWriter = csv.writer(open('kanjiVocabJoin.csv', 'wb'), delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
kanjiVocabJoinCount = 1
#loop through dictionary
for key, val in vocabDic.iteritems():
if val['lang'] is 'jpn': # only check japanese words
vocab = val['text']
print vocab
# loop through vocab string
for v in vocab:
test = kanjiDic.get(v)
print v
print test
if test is not None:
print str(kanjiVocabJoinCount)+','+str(test['id'])+','+str(val['id'])
kanjiVocabJoinWriter([str(kanjiVocabJoinCount),str(test['id']),str(val['id'])])
kanjiVocabJoinCount = kanjiVocabJoinCount+1
Run Code Online (Sandbox Code Playgroud)如果我将变量打印到命令行,我得到:
vocab:works,print in japanese
v(for循环中的一个字符): test
(字符在kanjiDic中查找):None
对我来说似乎是for循环使编码混乱.
我尝试了各种功能(解码,编码..)但到目前为止没有运气.
关于如何让这个工作的任何想法?
非常感谢帮助.
CPython在内部将unicode字符串存储为utf-16或utf-32,具体取决于编译选项.在utf-16版本的Python字符串切片,迭代中,len似乎可以处理代码单元,而不是代码点,因此多字节字符的行为很奇怪.
例如,在CPython 2.6上使用sys.maxunicode= 65535:
>>> char = u'\U0001D49E'
>>> len(char)
2
>>> char[0:1]
u'\uu835'
>>> char[1:2]
u'\udc9e'
Run Code Online (Sandbox Code Playgroud)
根据Python文档,sys.maxunicode"为Unicode字符提供最大支持代码点的整数".
这是否意味着unicode无法保证操作超出代码点sys.maxunicode?如果我想使用BMP之外的字符,我必须使用utf-32构建或编写我自己的便携式unicode操作吗?
我在如何迭代Python 3中的Unicode字符时遇到了这个问题?