IT TIP

바이트는 다르지만 값은 같은 유니 코드 문자열을 어떻게 비교합니까?

itqueen 2020. 12. 29. 08:13
반응형

바이트는 다르지만 값은 같은 유니 코드 문자열을 어떻게 비교합니까?


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'

두 유니 코드 문자열의 값을 어떻게 비교할 수 있습니까?


유니 코드 정규화 를 통해 다음과 같은 작업을 수행 할 수 있습니다.

>>> import unicodedata
>>> unicodedata.normalize("NFC", "\uf9fb") == "\u7099"
True

표준 유니 코드 동등성을 확인하기 위해 unicodedata.normalize비교하기 전에 두 문자열 모두에 사용하십시오 ==.

캐릭터 U+F9FB는 "CJK 호환성"캐릭터입니다. 이러한 문자는 정규화되면 하나 이상의 일반 CJK 문자로 분해됩니다.


문자 U+F9FB(炙)는 CJK 호환성 표의 문자 입니다. 이러한 문자는 일반 CJK 문자와 구별되는 코드 포인트이지만 정규화되면 하나 이상의 일반 CJK 문자로 분해됩니다.

유니 코드에는 정확히 이러한 목적으로 설계된 UCA 라는 공식 문자열 데이터 정렬 알고리즘 이 있습니다. Python은 3.7부터 UCA 지원과 함께 제공되지 않지만 *pyuca 다음 과 같은 타사 라이브러리가 있습니다 .

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

이 경우 (그리고 전부는 아니지만)의 경우 비교하기 전에 두 문자열에 적용 할 적절한 정규화선택하는 것이 작동하며 stdlib에 내장 된 지원의 이점이 있습니다.

*이 아이디어는 3.4 이후 원칙적으로 받아 들여졌지만 아무도 구현을 작성하지 않았습니다. 부분적으로 pyuca는 현재 및 이전 버전에서 작업 할 수있는 이점이있는 두 개의 ICU 바인딩 중 하나를 사용하고 있기 때문 입니다. 파이썬.


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

참조 URL : https://stackoverflow.com/questions/49662585/how-do-i-compare-a-unicode-string-that-has-different-bytes-but-the-same-value

반응형