[英]Python Inconsistent Special Character Storage In String
版本是Python 3.7。 我刚刚发现python有时会将字符ñ存储在具有多种表示形式的字符串中,而对于为什么或如何处理它,我完全不知所措。
我不确定显示此问题的最佳方法,所以我将仅显示一些代码输出。
我有两个字符串s1和s2都设置为等于'Dan Peña'
它们都是字符串类型。
我可以运行代码:
print(s1 == s2) # prints false
print(len(s1)) # prints 8
print(len(s2)) # prints 9
print(type(s1)) # print 'str'
print(type(s2)) # print 'str'
for i in range(len(s1)):
print(s1[i] + ", " + s2[i])
循环的输出为:
D, D
a, a
n, n
,
P, P
e, e
ñ, n
a, ~
那么,是否有任何python方法来处理这些不一致问题,或者至少有一些关于python什么时候使用哪种表示形式的规范?
很高兴知道Python为什么会选择以这种方式实现。
编辑:
一个字符串从Django数据库中检索,另一个字符串从解析列表目录调用中的文件名获得的字符串中。
from app.models import Model
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **kwargs):
load_dir = "load_dir_name"
save_dir = "save_dir"
files = listdir(load_dir)
save_file_map = {file[:file.index("_thumbnail.jpg")]: f"{save_dir}/{file}" for file in files}
for obj in Model.objects.all():
s1 = obj.title
save_file_path = save_file_map[s1] # Key error when encountering ñ.
然而,当我通过搜索save_file_map
字典我找到一把钥匙是完全一样的S1除了N是编码字符n~
而不是字符ñ
。
请注意,我在上述代码中使用list dir加载的文件首先是基于obj.title字段命名的,因此应确保该名称的文件位于load_dir
目录中。
您将需要规范化字符串以使用相同的表示形式。 现在,其中一个正在使用n
字符+波浪号字符(2个字符),而另一个正在使用单个字符代表n与波浪号。
unicodedata.normalize
应该做你想要的。 在此处查看文档。
您将需要这样称呼: unicodedata.normalize('NFC', s1)
。 'NFC'
告诉unicodedata.normalize
您想对所有内容使用组合形式,例如ñ
的1个字符的版本。 除了'NFC'
外,文档中还提供了其他选项,您完全可以使用。
现在,在什么时候进行规范化取决于您(我不知道您的应用程序的结构)。 例如,您可以在插入数据库之前进行标准化,或者在每次从数据库读取数据时进行标准化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.