Skip to content
On this page

📆 2015-08-31

TextViewで濁点の表示が崩れる

TextViewに濁点入り文字列を渡すと表示が崩れたのでメモ。 Unicodeの正規化方式には4種類あるそうだが、今回はNFD正規化した文字列で問題が起きており、それをNFC正規化することで解決した。

NFDな文字列を表示する場合と、それをNFCな文字列に変換して表示する場合で結果が違う。

java
int[] nfdCodePoints = new int[]{
		0x30C8, //ト
		0x3099, //゛
		0x30A4, //イ
		0x30C4, //ツ
};
String text = new String(nfdCodePoints, 0, nfdCodePoints.length);

// NFD文字列を表示
textView.setText(text);

// NFC文字列を表示
textView2.setText(Normalizer.normalize(text, Normalizer.Form.NFC));
Device / OSTextView
Nexus5 / 5.1.15.1.1.png
Nexus5 / 4.4.44.4.4.png

Android4.4.4では問題なかったが、Android5系から発生するようになった、のかな。 ネイティブでも対応できるが今回はサーバサイドで変換してもらった。

参考

文字コード地獄秘話 第3話:後戻りの効かないUnicode正規化

Released under the MIT License.