python2和python3中的python unicode问题

python2和python3中的python unicode问题,python,sqlite,python-3.x,unicode,utf-8,Python,Sqlite,Python 3.x,Unicode,Utf 8,我有一组python脚本()解析wikidump,将其转换为gpx/osm/csv/sql/sqlite转储,用作Nav应用程序中的POI文件。我只解析有坐标的文章。为此,我使用包含sql insert语句的externallinks转储。包含“geohack.php”子字符串的sql语句确实包含坐标。我将它们导入sqlite数据库,作为文章转储的参考。 它们都是utf-8转储文件,解析所有“西式”文件都很好,但阿拉伯语、波斯语、俄语、日语、希腊语、汉语和其他语言都不起作用。显然我做错了什么 我

我有一组python脚本()解析wikidump,将其转换为gpx/osm/csv/sql/sqlite转储,用作Nav应用程序中的POI文件。我只解析有坐标的文章。为此,我使用包含sql insert语句的externallinks转储。包含“geohack.php”子字符串的sql语句确实包含坐标。我将它们导入sqlite数据库,作为文章转储的参考。 它们都是utf-8转储文件,解析所有“西式”文件都很好,但阿拉伯语、波斯语、俄语、日语、希腊语、汉语和其他语言都不起作用。显然我做错了什么

我得到的标题字符串是:

%D9%85%D8%A7%D9%81%D8%B8%D8%A9%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D8%A6%D8%B9 %D8%A3%D9%88%D8%B1%D9%8A%D9%88%D9%8A%D9%84%D8%A7 尼科波利斯战役
青岛

所以一些普通字符是可以的。其余的(对我来说)都是胡言乱语。 我已经做了一些测试,只需读取转储并写入utf-8编码的文本文件(line-in=>line-out),然后它就可以正常工作,但在字符串处理函数和“re.”函数中的某个地方,它会更改我的unicode文本

编辑:我的python脚本以:#——编码:utf-8——
我的代码(相关部分,包括python2和python3语句,以及一些用于显示我已经尝试过的内容的注释):

使用gzip.open(externallinks_文件'r')作为单个_externallinks文件:
#reader=codecs.getreader(“utf-8”)
#single_ExternalInksFile=读卡器(single_ExternalInksFile)
#使用codecs.getreader('utf-8')gzip.open(externallinks_文件,'r')作为单个_externallinks文件:
linecounter=0
totlinecounter=0
filelinecounter=0
#我们需要逐行读取,因为我们有大量的文件,有时是多个GBs
对于单个外部链接文件中的行:
如果sys.version_info 0:#由于线路损坏,我们甚至需要此检查
拆分内容=内容[0]。拆分(&)
title=splitcontent[0]
#title=title.decode('utf8')
对于splitcontent中的分包:
如果“language=”在分包合同中:
language=subcent.replace(“language=”,“”)
#打印('taal is:'+语言)
如果“params=”在分包合同中:
params_string=subcent.replace(“params=”,“”)。split(“”)
纬度、经度、poitype、区域=获取坐标类型区域(参数字符串)
如果(str(纬度)!=”“和str(经度)!=”“和(str(纬度)!=“0”)或(str(经度)!=“0”):
如果生成_SQL==“是”:
sql_file.write('insert-into'+file_prefix+'.'外部链接值('+title+','+str(纬度)+','+str(经度)+','+language+','+poitype+','+region+');\n')
如果CREATE_SQLITE==“YES”:
sqlcommand='insert into'+文件\'前缀+''.'外部链接值(“'+title+”,“'+str(纬度)+',“'+str(经度)+',“'+language+”,“'+poitype+”,“'+region+”);'
#打印(sqlcommand)
cursor.execute(sqlcommand)
行计数器+=1
如果linecounter==10000:
如果CREATE_SQLITE==“YES”:
#每10000行执行一次数据库提交
wikidb.commit()
totlinecounter+=行计数器
linecounter=0
打印('\n处理'+str(filelinecounter)+'sql行语句中的'\n行'+str(totlinecounter)+'行。运行时间:'+str(datetime.datetime.now().replace(微秒=0)-开始时间))

看起来标题是

屈服

مافظة_البدائع
أوريويلا
Battle_of_Nicopolis
Qingdao

非常感谢你。成功了!我尝试了许多解码/编码选项,但从未听说过百分比编码。@HarryvanderWolf:常用于URL。而且非常类似(
%20
->
+
application/x-www-form-urlencoded
内容类型在过去经常被用于通过web表单(通过http)提交内容。我知道URL中的%20和其他编码。我从来没有把“其中一些字符”和只有这些字符的句子联系起来。
try:
    # Python 3
    from urllib.parse import unquote
except ImportError:
    # Python 2
    from urllib import unquote

percent_encoded = '''
%D9%85%D8%A7%D9%81%D8%B8%D8%A9_%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D8%A6%D8%B9
%D8%A3%D9%88%D8%B1%D9%8A%D9%88%D9%8A%D9%84%D8%A7
Battle_of_Nicopolis
Qingdao
'''
print(unquote(percent_encoded))
مافظة_البدائع
أوريويلا
Battle_of_Nicopolis
Qingdao