바이트는 다르지만 값은 같은 유니 코드 문자열을 어떻게 비교합니까?
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
'IT TIP' 카테고리의 다른 글
WKWebView에서 모든 쿠키 가져 오기 (0) | 2020.12.29 |
---|---|
중첩 배열 내에서 일치하는 하위 문서 요소 만 반환 (0) | 2020.12.29 |
viewstate를 디코딩하는 방법 (0) | 2020.12.29 |
UITableView에 바닥 글을 추가하는 방법은 무엇입니까? (0) | 2020.12.29 |
git이 cygwin에서 파일을 실행 불가능하게 만드는 것을 막는 방법은 무엇입니까? (0) | 2020.12.29 |