2016-04-05 36 views
0

'É' (E\xcc\x81) ve 'É' (\xc3\x89) karakterleri farklı kod noktalarına sahiptir. Aynı görünüyorlar, ancak bir maç için test yaparken sonuç negatiftir.Düz bash'ta dize normalleştirme

Python bunları normalleştirebilir, ancak: unicodedata.normalize('NFC', 'É'.decode('utf-8')) == unicodedata.normalize('NFC', 'É'.decode('utf-8')), True değerini döndürür. Ve e olarak yazdırır.

Soru: saf bash * dizelerini normalize etmenin bir yolu var mı? Ben iconv içine baktım ama bildiğim kadarıyla ascii'ye bir dönüşüm yapabilir ama normalleştirilemez.

* GNU bash mevcut uconv varsa, bu muhtemelen işi yapacağım, versiyon 3.2.57 (1) -salınımı (x86_64-elma-darwin14))

+1

Kabuklardaki dizgilerin taşınması tasarım açısından minimalisttir. Unicode normalizasyonu sadece uymuyordu, bu yüzden yerleşik olsaydı şaşırırdım. – Jens

+0

'iconv' "saf bash" olarak mı düşünüyorsunuz? Bu sadece Python gibi harici bir program. – chepner

+0

Özür dileriz, spec özelliklerine göre os x shell'den doğal olarak kullanılabilir. – user2243670

cevap

1

:

$ echo -en "E\xcc\x81" | uconv -x Any-NFC | hexdump -C 
00000000 c3 89 
$ echo -en "\xc3\x89" | uconv -x Any-NFC | hexdump -C 
00000000 c3 89 

Ayrıştırılmış form için Any-NFD da mevcuttur.

+0

Maalesef ("uconv" adıyla kullanılabilir formül yok) – user2243670

+0

Bulunan uconv. [Icu4c] 'nin bir parçasıdır (http://brewformulas.org/Icu4c) ve/usr/local/Cellar/icu4c/56.1/bin/uconv 'dizinine yapıştırılmıştır. Ancak, yerel (taşınabilir) bir çözüm için minnettar olacağım. – user2243670