ある日、UIデザインの観点で以下のような要件が求められました。 ①任意の幅で表示できるなら1行で。②表示しきれない場合は改行していい。③しかし、ある文節は改行で区切られないようにしたい。 最後の項目③のおかげで一見、困難そうですが、スマホアプリで一般的に用いられている文字コード規格「Unicode」に、まさに最適の文字がありました。 参考:The Unicode Standard / Chapter 4 Character Properties 0020 space00A0 no-break space 「0020 space」は、お馴染み「スペースキー」で打てる空白です。「00A0 no-break space」は、見た目は空白と同じですが、「改行しない」という役目を持っています。 定義をリソースだけで解決する Android版とiOS版ともに、この「改行しない空白を含めた文字列」の定義をリソースファイルだけで解決します。(プログラムコードを使うのはそのリソースを参照するときだけです) Android版 それではまず、Android版から実装してみます。 "title2"の文字列では、カッコ内の空白を「\u00A0」に置き換えています。 リソース参照ではなく、直接文字列を書く場合も同様に「\u00A0」と表記できます。 HTMLのように例えば「&」を表示するときは「&」と表記するので、これについても「 」などと表記すると思ったのですが、変換されませんでした。 iOS版 次にiOS版で実装します。 iOS版のリソースでは「\U00a0」のように、大文字の\Uとコードで表記します。 参考:Using Special Characters in String Resources リソース参照ではなく、直接文字列を書く場合は「\u{00a0}」のように、小文字の\uと波括弧で表記する必要があります。 参考:Special Characters in String Literals 同じ意味なのに異なる表記を混在させると、管理や変更に支障がでる恐れがあるので、実装するときは全てリソース定義にすることをおすすめします。 おわりに アプリの多言語対応について、例えば小さいボタンなどの文言が言語ごとに文字数の差が大きいとデザインの影響も大きくなり、「英語版だけ改行する」などの調整が必要になりました。今回のように「特殊な文字」の存在を知っておくと役に立ったので、基本的な内容ですが今回、Android版、iOS版 ともに、ここにまとめました。

Read more of this post