python - मैं एक यूनिकोड स्ट्रिंग की तुलना कैसे करता हूं जिसमें अलग-अलग बाइट्स हैं, लेकिन समान मूल्य है?




unicode (2)

मैं JSON ऑब्जेक्ट्स के बीच यूनिकोड स्ट्रिंग्स की तुलना कर रहा हूं।

उनका समान मूल्य है:

a = '人口じんこうに膾炙かいしゃする'
b = '人口じんこうに膾炙かいしゃする'

लेकिन उनके पास अलग-अलग यूनिकोड अभ्यावेदन हैं:

String a : u'\u4eba\u53e3\u3058\u3093\u3053\u3046\u306b\u81be\u7099\u304b\u3044\u3057\u3083\u3059\u308b'
String b : u'\u4eba\u53e3\u3058\u3093\u3053\u3046\u306b\u81be\uf9fb\u304b\u3044\u3057\u3083\u3059\u308b'

मैं उनके मूल्य पर दो यूनिकोड तार के बीच तुलना कैसे कर सकता हूं?


चरित्र U+F9FB (炙) एक CJK संगतता आइडियोग्राफ़ है । ये वर्ण नियमित CJK वर्णों से अलग कोड बिंदु होते हैं, लेकिन सामान्य होने पर वे एक या अधिक नियमित CJK वर्णों में विघटित हो जाते हैं।

यूनिकोड में एक आधिकारिक स्ट्रिंग कोलाज़ एल्गोरिथ्म है जिसे UCA कहा जाता है जिसे बिल्कुल इसी उद्देश्य के लिए डिज़ाइन किया गया है। पाइथन 3.7 के रूप में यूसीए समर्थन के साथ नहीं आता है, * लेकिन तीसरे पक्ष के पुस्तकालय हैं जैसे pyuca :

>>> from pyuca import Collator
>>> ck = Collator().sort_key
>>> ck(a) == ck(b)
True

इस मामले के लिए - और कई अन्य, लेकिन निश्चित रूप से सभी सामान्य नहीं होंगे - दोनों स्ट्रिंग्स को लागू करने से पहले लागू करने के लिए उपयुक्त सामान्यीकरण को चुनना होगा, और इसमें स्टैडलिब में निर्मित समर्थन का लाभ है।

* इस विचार को 3.4 के बाद से सिद्धांत रूप में स्वीकार किया गया है, लेकिन किसी ने कार्यान्वयन नहीं लिखा है - क्योंकि कोर के अधिकांश pyuca जो देखभाल करते हैं, वे pyuca या दो आईसीयू बाइंडिंग में से एक का उपयोग कर रहे हैं, जिसमें वर्तमान और पुराने संस्करणों में काम करने का लाभ है अजगर का।


मैंने PyICU और उसके Collator वर्ग का उपयोग किया होगा। लेकिन सबसे पहले, आपको यह सोचना चाहिए कि यूनिकोड महाविद्यालय एल्गोरिथ्म के किस स्तर पर आप समानता चाहते हैं।

#!/usr/bin/python
# -*- coding: utf-8 -*-

from icu import Collator

coll = Collator.createInstance()
coll.setStrength(Collator.IDENTICAL)

a = u'人口じんこうに膾炙かいしゃする'
b = u'人口じんこうに膾炙かいしゃする'
print repr(a)
print repr(b)
print ('%s == %s : %s' % (a, b, coll.equals(a,b)))

a = u'エレベーター'
b = u'エレベーター'
print ('%s == %s : %s' % (a, b, coll.equals(a,b)))

coll.setStrength(Collator.PRIMARY)
print ('%s == %s : %s' % (a, b, coll.equals(a,b)))

a = u'hello'
b = u'HELLO'
coll.setStrength(Collator.PRIMARY)
print ('%s == %s : %s' % (a, b, coll.equals(a,b)))

coll.setStrength(Collator.TERTIARY)
print ('%s == %s : %s' % (a, b, coll.equals(a,b)))

यह आउटपुट:

u'\u4eba\u53e3\u3058\u3093\u3053\u3046\u306b\u81be\u7099\u304b\u3044\u3057\u3083\u3059\u308b'
u'\u4eba\u53e3\u3058\u3093\u3053\u3046\u306b\u81be\uf9fb\u304b\u3044\u3057\u3083\u3059\u308b'
人口じんこうに膾炙かいしゃする == 人口じんこうに膾炙かいしゃする : True
エレベーター == エレベーター : False
エレベーター == エレベーター : True
hello == HELLO : True
hello == HELLO : False




unicode