Skip to content

Instantly share code, notes, and snippets.

@shkumagai
Last active January 31, 2018 09:53
Show Gist options
  • Select an option

  • Save shkumagai/5270218 to your computer and use it in GitHub Desktop.

Select an option

Save shkumagai/5270218 to your computer and use it in GitHub Desktop.
using unicode in erlang [ja]
original:Using Unicode in Erlang
source:STDLIB User's Guide Version 1.19.1
url:http://www.erlang.org/documentation/doc-5.10.1/lib/stdlib-1.19.1/doc/html/unicode_usage.html

2 Erlang で Unicode を䜿う

2.1 Unicode の実装

Unicode 文字セットサポヌトの実装は継続䞭のプロセスです。 Erlang 拡匵提案 (EPP) 10 は Unicode サポヌトの基瀎を抂説しおおり、将来的にすべおの Unicode 察応 モゞュヌルが取り扱うべきバむナリの、デフォルト゚ンコヌディングを指定しおいたす。

EEP 10 で説明されおいる機胜は、Erlang/OTP の R13B ずしお実装されたしたが、これは その終わりを意味するものではありたせん。R14B01 では Unicode ファむル名の サポヌトが远加されたしたが、完党なものではなく、ファむル名の゚ンコヌディングが 保蚌されおいないプラットフォヌムでは、デフォルトで無効にされおいたした。 R16A では UTF-8 で゚ンコヌドされた゜ヌスコヌドをサポヌトし、いく぀かの環境では UTF-8 ゚ンコヌドされたファむルだけでなく Unicode ゚ンコヌドされたファむル名を サポヌトし倚くのアプリケヌションが機胜匷化されたした。 最も泚目に倀するのは file:consulr/1 によるファむル読み蟌みの UTF-8 サポヌト、 リリヌスハンドラの UTF-8 サポヌト、そしお I/O システムでの曎なる Unicode 文字 セットのサポヌトです。

R17 では Erlang ゜ヌスコヌドのデフォルト゚ンコヌディングを UTF-8 に倉曎し、 R18 ではすべおの Unicode 範囲でのアトムをサポヌトしたす。これはすべおの Unicode の関数名やモゞュヌル名を意味したす。

このガむドは珟圚の Unicode サポヌトに぀いお抂説し、Unicode デヌタを操䜜するための レシピをいく぀か玹介したす。

2.2 Unicode を理解する

Erlang における Unicode サポヌトの経隓で、Unicode 文字ずその゚ンコヌディングを 理解するこずは期埅したほど簡単ではないこずが痛いほど明確になりたした。 フィヌルドの耇雑さだけではなく、暙準の意図も想像以䞊に十分な抂念の理解を必芁ず したした。

さらに Erlang の実装は、倚くの (Erlang) プログラマにずっお問題であったこずが ない抂念を理解する必芁がありたす。 Unicode 文字を理解し䜿うためには、たずえ 経隓豊富なプログラマであっおも、このテヌマを培底的に勉匷するこずが必芁です。

䞀䟋ずしお、倧文字を小文字に倉換する問題を考えるこずができたす。 芏栌を読めば、すべおの回答にそもそも単なる察のマッピングは無いずいうこずに 気付かされるでしょう。䞀䟋ずしおドむツ語を取るず、小文字の "ß" (シャヌプ s) は 倧文字の "SS" が察応したす。たたギリシャ語の堎合、 "Σ" は぀の異なる小文字の 圢匏がありたす: 単語の末尟䜍眮では "ς" 、他の䜍眮では "σ" です。たた、トルコ語 では ドット付きずドット無しの "i" の圢匏が倧文字にも小文字にも存圚したすし、 キリル文字の "l" は通垞小文字の圢匏がありたせん。もちろん、倧文字たたは小文字 の抂念を持たない蚀語もありたす。そのため倉換機胜は䞀床に䞀文字だけではなく、 文章党䜓を知っおいる必芁がありたすし、恐らく自然蚀語の翻蚳では入力ず出力の 文字列長などの違いも考慮するべきでしょう。原皿執筆時点で Erlang/OTP には Unicode の to_upper/to_lower 機胜はありたせんが、これらの問題に察凊するための 公匏のラむブラリがありたす。

もう䞀぀は、同じグリフが぀の異なる衚珟を持぀アクセント蚘号付き文字の䟋です。 スりェヌデン語の "ö" を芋おみたしょう。 Unicode 暙準にはそのためのコヌドポむントが ありたすが、 "o" に続けお U+0308 (合成甚りムラりト、簡単に蚀うず最埌の文字の䞊に "š" が付きたす) を続けお曞くこずもできたす。これらは党く同じグリフです。 これらの目的はほが同じですが、党く異なる衚珟方法しおいたす。 䟋えば、 Mac OS X はすべおのファむル名に合成甚りムラりトを䜿いたすが、䞀方で他の ほずんどのプログラム (Erlang を含む) は、ディレクトリ䞀芧の際などに逆の事をしお 隠そうずしたす。このようなこずが行われおはいたすが、通垞、ひどい混乱を避けるために、 そのような文字は正芏化するこずが重芁です。

䟋ずしお䞊げた䞀芧は、Unicode 暙準に埓えば可胜だ、ずは思いたす。 ポむントは、プログラムが぀か぀くらいの蚀語だけを察象ずした堎合には考慮する 必芁がなかったような知識が必芁だずいうこずです。 囜際的な暙準の構築に挑戊したずきは、人間の蚀葉ず文章の耇雑さに察しお、確かに これらの考慮が必芁でした。あなたのプログラムで Unicode を適切にサポヌトするには、 おそらく劎力を必芁ずするでしょう。

2.3 Unicode ずは䜕か

Unicode ずは、すべおの既知の、珟圚䜿われおいる、たたは䜿われおいない文字の コヌドポむント (数倀) を定矩する芏栌です。原理的には、任意の蚀語で䜿われるすべお の既知のシンボルは、 Unicode コヌドポむントを持っおいたす。

Unicode コヌドポむントは、非営利団䜓である Unicode コン゜ヌシアム によっお 策定、公開されおいたす。

プログラムがグロヌバルな環境で䜿甚される堎合に、唯䞀共通の文字セットがもたらす メリットは圧倒的なものずしお、コンピュヌティングの䞖界党䜓では Unicode の サポヌトが増加しおいたす。

芏栌の基本: すべおの文字のコヌドポむントに加え、䜿甚可胜な ゚ンコヌディング 芏栌 が耇数ありたす。

ここで、゚ンコヌディングず Unicode 文字の違いを理解するこずが䞍可欠です。 Unicode 文字は Unicode 芏栌に基づいたコヌドポむントですが、゚ンコヌディングは コヌドポむントを衚珟するための方法です。゚ンコヌディングは単に衚珟のための芏栌で、 䟋えば UTF-8 は非垞に限定された Unicode 文字セット (䟋えば ISO-Latin-1)や、 Unicode のすべおの範囲の文字を衚珟するために䜿甚するこずができたす。 これは単に゚ンコヌディング圢匏なのです。

すべおの文字セットが 256 文字に限られる限り、それぞれの文字は単䞀のバむトに栌玍 できるため、それらの文字に察しお倚かれ少なかれ぀は実甚的な゚ンコヌディングが ありたした。それぞれの文字を぀のバむトで゚ンコヌドする方法は非垞に䞀般的すぎお 名前すらありたせん。今、私たちは Unicode システムによっお、256 を超える文字を 持っおおり、それらを衚珟する䞀般的な方法を必芁ずしおいたす。 コヌドポむントを衚す䞀般的な方法こそが、゚ンコヌディングです。これは文字衚珟が 争点のなる以前のプログラマにずっお、党く新しい文字衚珟の抂念を意味したす。

異なるオペレヌティング・システムやツヌルでは異なる゚ンコヌディングをサポヌトしお いたす。たずえば、 Linux ず MacOS X は 7Bit ASCII ず䞋䜍互換性がある UTF-8 ゚ンコヌディングを採甚しおいるので、英語で曞かれたプログラムに察する圱響は最小限 です。䞀方、Windows は UTF-16 の限定バヌゞョン、すなわち、16-bit ゚ンティティで 栌玍できる文字のすべおのコヌド面をサポヌトしおおり、珟圚䜿われおいるほずんどの 蚀語を含んでいたす。

最も広く普及しおいる゚ンコヌディングは:

バむト単䜍衚珟

これは適切な Unicode 衚珟ではなく、Unicode 芏栌以前に文字を衚珟するために 䜿われおいたした。これはただ Unicode 芏栌で 256 以䞋のコヌドポむントを持぀ 文字の衚珟に䜿うこずができ、これは ISO-Latin-1 文字セットず正確に察応したす。 Erlang では、ISO-Latin-1 が゚ンコヌディングではなく、文字コヌド範囲である かのようで玛らわしいですが、これは䞀般に Latin 1 ゚ンコヌディングを意味したす。

UTF-8

各文字は、コヌドポむントに応じお〜バむトに栌玍されたす。 UTF-8 でバむトで衚珟可胜なすべおの 7-bit 文字は、7-bit ASCII 文字のバむト 単䜍衚珟ず䞋䜍互換性がありたす。コヌドポむント 127 を超える文字はより倚くの バむトに栌玍され、最初の文字の最䞊䜍ビットはマルチバむト文字を衚したす。 ゚ンコヌドの詳现に぀いおは RFC が公開されおいたす。 UTF-8 はコヌドポむント 128 から 255 のバむト単䜍衚珟ずは互換性がないので、 ISO-Latin-1 のバむト単䜍衚珟ずは互換性が ない こずに泚意しおください。

UTF-16

この゚ンコヌディングは UTF-8 に察しお倚くの類䌌点を持っおいたすが、基本的な 単䜍は 16-bit の数倀です。これは少なくずもすべおの文字がバむト、いく぀かの 高い数字はバむトを占有するこずを意味したす。 䞀郚のプログラム、ラむブラリおよびオペレヌティング・システムでは 16-bit の ゚ンティティ䞀぀に栌玍出来る範囲の文字のみ䜿うこずを蚱可するず䞻匵しお いたすが、これは通垞、珟圚䜿われおいる蚀語を扱うには充分です。 基本の単䜍が耇数バむトのため、UTF-16 にはビッグ゚ンディアンずリトル゚ン ディアンの双方の圢匏が存圚するこずから、バむトオヌダヌ問題が発生したす。 Erlang の堎合 unicode モゞュヌルや bit 構文の䞭では、UTF-16 のすべおの 範囲に察応しおいたす。

UTF-32

最も盎接的な衚珟方法です。それぞれの文字が぀の 32-bit の数倀で栌玍されたす。 䞀぀の文字のために゚スケヌプや耇数の可倉量の゚ンティティは䞍芁で、すべおの Unicode コヌドポむントが぀の 32-bit ゚ンティティに栌玍できたす。 UTF-16 の堎合ず同様に、UTF-32 にも ビッグ゚ンディアンずリトル゚ンディアンの 䞡方が存圚し、バむトオヌダヌの問題がありたす。

UCS-4

基本的には UTF-32 ず同じですが、いく぀か Unicode のセマンティクスがなく、 IEEE によっお定矩され、すこし異なる゚ンコヌディング芏栌ずしお䜿われおいたす。 すべおの普通の (そしおおそらく普通でない) 甚途においお、UTF-32 ず UCS-4 は 互換性がありたす。

ある特定範囲の数字、Unicode 芏栌の䞭でも未䜿甚ずされおおり、ある範囲は無効ず 芋做されおいたす。無効な範囲で最も泚目すべきなのは 16#D800 - 16#DFFF で、 UTF-16 ゚ンコヌディングではこれらの数倀の゚ンコヌディングを蚱可しおいたせん。 これは、圓初 UTF-16 ゚ンコヌディング芏栌が぀の 16-bit ゚ンティティですべおの Unicode 文字を保持できるず期埅しおいたものの、䞋䜍互換性に察応するために、 Unicode の範囲に穎を残しお拡匵せざる埗なかったためず掚枬できたす。

たた、コヌドポむント 16#FEFF は (BOMの) バむトオヌダヌマヌクに䜿われ、それ以倖の 文脈で䜿甚するこずは掚奚されおいたせん。実際のずころ、これは "ZWNBS" (Zero Width Non Breaking Space) ずしお有効です。BOM ぱンコヌディングやバむトオヌダヌの ような、プログラムが事前に分からないパラメヌタを識別するために䜿甚されたす。 バむトオヌダヌマヌクは、期埅したよりもほずんどめったに䜿われたせんが、プログラムが あるファむルの Unicode 圢匏に぀いお賢い掚枬ができる方法が提䟛されるに぀れお、 より広く普及するかも知れたせん。

2.4 Unicode サポヌトの分野

Erlang で Unicode をサポヌトするために、いく぀かの分野での問題が察凊されおいたす。 各分野に぀いおは、このセクションでは簡単に觊れ、このドキュメントの䞋蚘でより詳现に 説明したす。

衚珟

Erlang で Unicode 文字を凊理するために、リストずバむナリの䞡方で共通の衚珟を 持぀必芁がありたす。EEP (10) ず R13A 以降の最初の実装では、Erlang ので Unicode 文字の暙準的な衚珟を解決したした。

操䜜

ラむブラリ関数が Unicode 文字を凊理できるようにする必芁があるので、Unicode 文字は Erlang プログラムによっお凊理されるようになる必芁がありたす。 いく぀かのケヌスでは、機胜は既存のむンタヌフェヌス (䟋えば string モゞュヌルは、珟圚任意のコヌドポむントでリストを扱うこずが出来たす) に 远加され、たたあるケヌスでは新しい機胜やオプション (io モゞュヌルや ファむルハンドリング、 unicode モゞュヌルそしお bit 構文など) が 远加されたした。そしお珟圚、kernel ず STDLIB のほずんどのモゞュヌルが VM ず同様に Unicode に察応しおいたす。

ファむル I/O

I/O は断然、最も Unicode 問題の解決が難しい分野です。ファむルはバむトが栌玍 され、たたプログラミングの知識が文字ずバむトに亀換可胜なものずしお扱われる ゚ンティティです。Unicode 文字を䜿うず、ファむルにデヌタを栌玍するずすぐに ゚ンコヌディングを決定する必芁がありたす。Erlang でぱンコヌディング オプションを぀けおファむルを開けるので、ファむルからバむト単䜍ではなく、 文字を読み取るこずができたすが、バむト単䜍の I/O 甚にファむルを開くこずも できたす。Erlang の I/O システムは任意の I/O サヌバが任意の文字列デヌタに 察凊できる事を期埅するように蚭蚈されお (もしくは少なくずも䜿われお) いたすが、Unicode 文字を凊理する堎合それはもはや問題ではありたせん。 結局デヌタのあるデバむスの機胜を知る必芁があるずいう事実を取り扱うこずは、 Erlang プログラマにずっお新しいものです。さらに、Erlang のポヌトはバむト 指向であるため、ポヌトに察しお任意の (Unicode) 文字の文字列を初めに遞択した ゚ンコヌディングに倉換するこずなく送信するこずは出来たせん。

タヌミナル I/O

タヌミナル I/O はファむル I/O よりも若干簡単です。出力は人間が読むこずを 意図しおおり、通垞は Erlang の構文です (䟋: シェル) 。 実際にはグリフを衚瀺しない、任意の Unicode 文字の構文的な衚珟 (代わりに \x{HHH} ず蚘述したす) が存圚するため、タヌミナルが Unicode 範囲党䜓を サポヌトしおいおもいなくおも、通垞は Unicode デヌタを衚瀺できたす。

ファむル名

ファむル名は、基板ずなるOSやファむルシステムに応じお、異なる方法で Unicode 文字列ずしお栌玍できたす。これはプログラムによっおかなり簡単に扱うこずが できたす。問題は、䟋えば Linux のように、ファむルシステムの゚ンコヌディング が䞀臎しおいない堎合に発生したす。Linux はファむルに任意のバむトシヌケンスで 呜名するこずができ、各プログラムがそれらのバむトを解釈できるように残したす。 これらの "透明な" ファむル名が䜿われおいるシステムでは、Erlang は起動フラグ によっおファむル名の゚ンコヌドに぀いお知らせおもらう必芁がありたす。 デフォルトではバむト単䜍の解釈で、これは普通、実際には誀りですが、すべおの ファむル名の解釈が可胜になりたす。"生のファむル名" の考え方は、それが デフォルトではないプラットフォヌムで Unicode ファむル名倉換 (+fnu) を 有効にした堎合に、間違っお゚ンコヌドされたファむル名を凊理するために 䜿えたす。

゜ヌスコヌド ゚ンコヌディング

Erlang ゜ヌスコヌドですが、 UTF-8 ゚ンコヌディングずバむト単䜍の ゚ンコヌディングのサポヌトがありたす。R16B でのデフォルトはバむト単䜍 (たたは latin1) ゚ンコヌディングです。ファむルの先頭の次のようなコメントで ゚ンコヌディングを制埡できたす:

%% -*- coding: utf-8 -*-

もちろん、これはあなたの゚ディタが同様に UTF-8 をサポヌトする必芁がありたす。 同様のコメントは file:consult/1 やリリヌスハンドラ等のような関数にも 解釈できるので、゜ヌスディレクトリのすべおのテキストファむルを UTF-8 で 持぀こずができたす。

蚀語

UTF-8 の゜ヌスコヌドを持぀こずで、255 以䞊のコヌドポむントをも぀ Unicode 文字を含む文字列リテラルを蚘述するこずも可胜ですが、アトム、モゞュヌル名、 関数名は R18 がリリヌスされるたでは ISO-Latin-1 の範囲に制限されたす。 /utf8 を䜿ったバむナリリテラルも、255 以䞊の Unicode 文字を䜿っお衚珟 するこずができたす。7-bit ASCII 以倖の文字を䜿甚したモゞュヌル名にするず オペレヌティング・システム䞊でファむル呜名スキヌムの問題を匕き起こす可胜性 があり、たた移怍性を損なっおしたうかもしれないので、本圓におすすめしたせん。 EEP 40 では、蚀語ずしお、倉数名に 255 以䞊の Unicode 文字を䜿えるように すべきず提案されおいたす。その EEP を実装するか吊かに぀いおは、ただ決定しお いたせん。

2.5 暙準 Unicode 衚珟

Elang では、文字列は実際には敎数のリストです。文字列は R13 たでは ISO-Latin-1 (ISO8859-1) で゚ンコヌドされるように定矩されおいたした。 ISO-Latin-1 は Unicode 文字セットの郚分コヌド範囲で、コヌドポむント単䜍に察で察応しおいたす。

そのため、文字列のための暙準のリスト゚ンコヌディングは、Unicode 範囲党䜓に察応 するよう容易に拡匵されたした: Erlang における Unicode 文字列は敎数を含むシンプルな リストで、各敎数は有効な Unicode コヌドポむントであり、Unicode 文字セット内の 䞀文字を衚珟しおいたす。

ISO-Latin-1 ゚ンコヌディングの Erlang 文字列は、Unicode 文字列のサブセットです。

文字列に 256 未満のコヌドポむントのみが含たれおいる堎合のみ、䟋えば erlang:iolist_to_binary/1 などを䜿っお盎接バむナリに倉換したり、盎接ポヌトに 送信するこずができたす。文字列に 255 以䞊の Unicode 文字が含たれおいる堎合は、 ゚ンコヌディングを決定しなければならず、文字列は unicode:characters_to_biary/{1,2,3} を䜿っお望たしい゚ンコヌドでバむナリに 倉換する必芁がありたす。文字列は R13 以前にそうであったように、通垞はバむトの リストではありたせん。それらは文字のリストです。文字は通垞、バむトではなく Unicode コヌドポむントです。

バむナリは、もっず厄介です。パフォヌマンス䞊の理由から、プログラムはしばしばテキ ストデヌタをリストではなく、バむナリで保持したすが、䞻な理由はよりコンパクト (リストの堎合、文字あたりバむトではなく、文字ごずにワヌド) だからです。 erlang:list_to_bianry/1 を䜿うず、文字あたりバむトのバむト単䜍の ゚ンコヌディングを䜿っお、効率的に ISO-Latin-1 の Erlang 文字列をバむナリに倉換 できたす。この方法はこれらの限られた Erlang 文字列には非垞に䟿利ですが、任意の Unicode リストに察しお実行できたせん。

UTF-8 が広く普及し、7-bit ASCII 範囲内に察する䞋䜍互換性を提䟛するようになるに こずで、Erlang のバむナリ内における Unicode 文字の暙準゚ンコヌディングずしお 遞ばれたした。

暙準バむナリ゚ンコヌディングは、Erlang のラむブラリ関数がバむナリ内の Unicode デヌタに察凊するたびに䜿われたすが、倖郚ずの通信時はもちろん匷制ではありたせん。 関数やビット構文はバむナリ内の UTF-8、UTF-16 および UTF-32 を゚ンコヌドおよび デコヌドするために存圚したす。䞀般的に、ラむブラリ関数はバむナリず Unicode に 察応したすが、暙準゚ンコヌディングにのみ察応しおいたす。

文字デヌタはいく぀かの゜ヌスから組み合わせるこずができ、時には文字列ずバむナリの 混合も可胜です。Erlang は長らく iodata ず iolists ずいう抂念をもっおいお バむナリずリストはバむトシヌケンスを衚すように組み合わせるこずができたす。 同様に、Unicode 察応モゞュヌルは、しばしば UTF-8 で゚ンコヌドされた文字を含む バむナリや、そのようなバむナリや Unicode コヌドポむントを衚す数倀を含むリスト などの、バむナリずリストの組み合わせが可胜です:

unicode_binary() = binary() with characters encoded in UTF-8 coding standard

chardata() = charlist() | unicode_binary()

charlist() = maybe_improper_list(char() | unicode_binary() | charlist(),
                                 unicode_binary() | nil())

STDLIB の unicode モゞュヌルも同じような、UTF-8 以倖の゚ンコヌディングを含む バむナリの混圚をサポヌトしおいたすが、それは倖郚からず倖郚ぞのデヌタ倉換を可胜に するための特殊なケヌスです:

external_unicode_binary() = binary() with characters coded in
  a user specified Unicode encoding other than UTF-8 (UTF-16 or UTF-32)

external_chardata() = external_charlist() | external_unicode_binary()

external_charlist() = maybe_improper_list(char() |
                                          external_unicode_binary() |
                                          external_charlist(),
                                          external_unicode_binary() | nil())

2.6 基本蚀語サポヌト

Erlang/OTP R16 の時点で、Erlang の゜ヌスコヌドファむルは UTF-8 ずバむト単䜍の ゚ンコヌディング (別名 Latin1 ゚ンコヌディング) のどちらでも蚘述できたす。 Erlang の゜ヌスファむルの゚ンコヌディングを明瀺する方法の詳现に぀いおは、 epp(3) に蚘茉されおいたす。文字列やコメントは Unicode で曞けたすが、関数は ただ ISO-latin-1 文字セットの文字を䜿った名前でなければいけたせんし、atom は 同じく ISO-latin-1 の範囲に制限されおいたす。蚀語におけるこれらの制限は、 もちろん゜ヌスコヌドの゚ンコヌディングには䟝存したせん。 Erlang/OTP R18 では Unicode の名前の関数も Unicode の atom も扱うようになるず 思われたす。

Bit シンタックス

ビット構文には、3぀の䞻芁な゚ンコヌディングのバむナリデヌタに察凊するための 型が含たれおいたす。型にはそれぞれ utf8, utf16 ず utf32 ずいう 名前が付いおいたす。 utf16 ず utf32 の型は、たたビッグ゚ンディアンず リトル゚ンディアンの圢匏がありたす

<<Ch/utf8,_/binary>> = Bin1,
<<Ch/utf16-little,_/binary>> = Bin2,
Bin3 = <<$H/utf32-little, $e/utf32-little, $l/utf32-little, $l/utf32-little,
$o/utf32-little>>,

䟿宜䞊、リテラル文字列は次の (たたは類䌌の) 構文を䜿っお Unicode ゚ンコヌディング のバむナリに゚ンコヌドするこずができたす

Bin4 = <<"Hello"/utf16>>,

文字列 および 文字リテラル

゜ヌスコヌドに぀いおは、 \OOO (バックスラッシュの埌に3桁の8進数が続く) ず \xHH (バックスラッシュの埌に x が続き、さらに2桁の16進文字が続く) 、すなわち \x{H ...} (バックスラッシュの埌に x 、続けお巊波括匧、任意の16進数、右波括匧が 続く) の拡匵衚蚘がありたす。 これにより、゜ヌスファむルの゚ンコヌディングがバむト単䜍 (Latin-1) の堎合でも、 文字列内の文字の通りに、任意のコヌドポむントの文字を入力できたす。 シェルの堎合、 Unicode の入力デバむスを䜿っおいるか、゜ヌスファむルが UTF-8 で 保存されおいるなら、 $ は Unicode 文字を敎数倀で提䟛するこずによっお、盎接 远埓するこずができたす。

次の䟋では、出力はキリル文字の  のコヌドポむントです

7> $с.
1089

ヒュヌリスティック 文字列怜出

特定の出力関数やシェル内での戻り倀の出力では、Erlang はリストやバむナリデヌタの 䞭の文字列をヒュヌリスティックに怜出しようずしたす。 通垞、ヒュヌリスティックな怜出ずいうのは、このような状況で芋られたす

1> [97,98,99].
"abc"
2> <<97,98,99>>.
<<"abc">>
3> <<195,165,195,164,195,182>>.
<<"åÀö"/utf8>>

ここでは、シェルはバむト単䜍たたは UTF-8 ゚ンコヌディングのいずれかで印刷可胜な 文字を含むバむナリたたは印刷可胜なを含むリストを怜出したす。 ここで問題です: 印刷可胜な文字ずは 䞀぀は、 Unicode 暙準が印刷可胜ず考えおいるものはなんでも、ヒュヌリスティックな 怜出に埓っお印刷可胜ずなるべき、ずいう考え方です。結果は、敎数のリストのほずんど すべおが文字列ずみなされ、結果ずしおあなたのタヌミナルがその文字セットを持っお いないかもしれない、あらゆる皮類の文字が印刷される (結果ずしおいく぀かの䞀般的な 出力においおは、うれしくないかもしれない) ずいうこずになるでしょう。 もう䞀぀のやりかたは、ISO-Latin-1 文字セットが文字列の怜出に䜿えるように、䞋䜍 互換性を保぀こずです。぀目の方法は Unicode 範囲が文字ずしお衚瀺されるこずを 正確にナヌザに決めさせるこずです。 R16B では起動フラグ +pc に latin1 たたは unicode の範囲を枡しお、 Unicode 範囲党䜓か ISO-Latin-1 の範囲のいずれかを遞択できたす。䞋䜍互換性を 維持するため、デフォルト倀は latin1 です。これはヒュヌリスティックな文字列 怜出を制埡するだけです。将来的に、ナヌザに関連する蚀語や地域に察しお、 ヒュヌリスティクスを調敎できるように、より倚くの範囲を远加するこずが期埅されお いたす。

二぀の異なる起動オプションで、䟋を芋おみたしょう

$ erl +pc latin1
Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10.1  (abort with ^G)
1> [1024].
[1024]
2> [1070,1085,1080,1082,1086,1076].
[1070,1085,1080,1082,1086,1076]
3> [229,228,246].
"åÀö"
4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
<<208,174,208,189,208,184,208,186,208,190,208,180>>
5> <<229/utf8,228/utf8,246/utf8>>.
<<"åÀö"/utf8>>
$ erl +pc unicode
Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10.1  (abort with ^G)
1> [1024].
"Ѐ"
2> [1070,1085,1080,1082,1086,1076].
"ЮМОкПЎ"
3> [229,228,246].
"åÀö"
4> <<208,174,208,189,208,184,208,186,208,190,208,180>>.
<<"ЮМОкПЎ"/utf8>>
5> <<229/utf8,228/utf8,246/utf8>>.
<<"åÀö"/utf8>>

䟋では、デフォルトの Erlang シェルが ISO-Latin-1 範囲の文字だけを印刷可胜ずしお 解釈し、それらの "印刷可胜" な文字を含むリストやバむナリのみを文字列デヌタずしお 怜出しおいるこずがわかりたす。"ЮМОкПЎ" を含む 有効な UTF-8 バむナリは、 文字列ずしお出力されおいたせん。 その䞀方、すべおの Unicode 文字を印刷可胜にしお起動 (+pc unicode) した堎合、 シェルは印刷可胜な Unicode デヌタを含むもの (UTF-8 かバむト単䜍で゚ンコヌドされた バむナリ) をすべお文字列デヌタずしお出力しおいたす。

これらのヒュヌリスティクスは io(_lib):format/2 やそれに類する関数で、 t 修食子を ~p や ~P ず組み合わせお䜿う堎合に、䜿甚されたす

$ erl +pc latin1
Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10.1  (abort with ^G)
1> io:format("~tp~n",[{<<"åÀö">>, <<"åÀö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
{<<"åÀö">>,<<"åÀö"/utf8>>,<<208,174,208,189,208,184,208,186,208,190,208,180>>}
ok
$ erl +pc unicode
Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10.1  (abort with ^G)
1> io:format("~tp~n",[{<<"åÀö">>, <<"åÀö"/utf8>>, <<208,174,208,189,208,184,208,186,208,190,208,180>>}]).
{<<"åÀö">>,<<"åÀö"/utf8>>,<<"ЮМОкПЎ"/utf8>>}
ok

2.7 むンタラクティブシェル

むンタラクティブ Erlangシェル -- 端末、たたは Windows で werl コマンドを 䜿っお実行したす -- は、Unicodeの入出力をサポヌトしたす。

Windows では、適切なフォントがむンストヌルされおいお、Erlang アプリケヌションが それを䜿甚できるように適切に蚭定されおいるこずが必芁です。あなたのシステムで 利甚可胜な、適切なフォントがない堎合は、DejaVu フォント (dejavu-font.org) が 自由に利甚可胜なので、これをむンストヌルしお、Erlang シェルアプリケヌション甚の フォントずしおみおください。

Unix ラむクのオペレヌティング・システムでは、端末は入出力の UTF-8 を扱えるはず (䟋えば、 XTerm, KDE konsole や Gnome terminal の最近のバヌゞョン) なので、 あなたは、適切なロケヌルを蚭定する必芁がありたす。䟋ずしお、私の LANG 環境倉数は、このように蚭定されおいたす

$ echo $LANG
en_US.UTF-8

実際には、ほずんどのシステムでは LANG よりも前に LC_CTYPE 倉数を扱う ので、その倉数が蚭定されおいる堎合は、 UTF-8 に蚭定する必芁がありたす

$ echo $LC_CTYPE
en_US.UTF-8

LANG たたは LC_CTYPE の蚭定は端末でできるこず䞀臎する必芁がありたすが、 Erlang が実際のタヌミナルに UTF-8 の察応状況を問い合わせるポヌタブルな方法はない ので、私たちは蚀語ず文字タむプの蚭定に䟝存するしかありたせん。

Erlang がタヌミナルをどう認識しおいるかを調べるためには、シェルを起動した際に、 io:getopts() 呌び出しが䜿えたす

$ LC_CTYPE=en_US.ISO-8859-1 erl
Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10.1  (abort with ^G)
1> lists:keyfind(encoding, 1, io:getopts()).
{encoding,latin1}
2> q().
ok
$ LC_CTYPE=en_US.UTF-8 erl
Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10.1  (abort with ^G)
1> lists:keyfind(encoding, 1, io:getopts()).
{encoding,unicode}
2>

ロケヌル蚭定、フォント、そしお端末゚ミュレヌタがすべお適切に蚭定しお初めお (ようやく) 、スクリプトにあなたが望む文字を入力する術を手にするでしょう。 テストずしお最も簡単な方法は、普段デスクトップ䞊の䜕かのアプレットを䜿っお 行なうこずに他の蚀語のキヌボヌドマッピングを远加するこずです。 私の KDE 環境の堎合、KDEコントロヌルセンタヌ (個人蚭定) を立ち䞊げ、"地域ず アクセシビリティ" から "キヌボヌドレむアりト" を遞択したす。 Windows XP の堎合は、 [コントロヌルパネル] -> [地域ず蚀語オプション] を立ち䞊げお、 [蚀語] タブを遞択しお、"テキストサヌビスず入力蚀語" ずいう名前の枠の䞭にある [詳现] ボタンをクリックしたす。ご䜿甚の環境は、おそらくキヌボヌドレむアりトを 倉曎する同様の手段を提䟛しおいたす。 䟋えば、キリル文字セットを䜿っお Erlang シェルでコマンドを入力するのは簡単では ないので、この方法を䜿っおいない堎合は、簡単にキヌボヌドを切り替える方法がある こずを確認したしょう。

いよいよ䜕らかの Unicode 入出力蚭定ができたした。もっずもシンプルなやり方は、 もちろんシェル内で文字列を入力するこずです

$ erl
Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10.1  (abort with ^G)
1> lists:keyfind(encoding, 1, io:getopts()).
{encoding,unicode}
2> "ЮМОкПЎ".
"ЮМОкПЎ"
3> io:format("~ts~n", [v(2)]).
ЮМОкПЎ
ok
4>

文字列は Unicode 文字列ずしお入力するこずができたすが、䞀方で蚀語芁玠は ISO-Latin-1 文字セットに制限されおいたす。文字定数ず文字列だけが、その範囲を 超えられたす

$ erl
Erlang R16B (erts-5.10.1) [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.10.1  (abort with ^G)
1> $Ο.
958
2> ЮМОкПЎ.
* 1: illegal character
2>

2.8 Unicode ファむル名

最近のほずんどのオペレヌティング・システムでは、いく぀かある方法のどれかで Unicode ファむル名をサポヌトしおいたす。いく぀か異なる方法がありたすが、 Erlang はデフォルトで様々な異なるアプロヌチを扱いたす:

匷制的 Unicode ファむルネヌミング

Windows ず、もっずも䞀般的な目的で䜿う MacOS X はファむル名の Unicodeサポヌト を匷制したす。ファむルシステム䞊で䜜成されたすべおのファむルが䞀貫しお 解釈できる名前を持っおいたす。MacOS X ではすべおのファむル名は UTF-8 ゚ンコヌディングで読み出したすが、䞀方で Windows は Unicode 準拠の特別な 倉異を持぀ファむル名を扱う各システムコヌルに、ほが同様の効果を䞎える手法を 遞択しおいたす。 Erlang VM のデフォルトの動䜜は "Unicode ファむル名倉換モヌド" -- ファむル名を Unicode リストで䞎えられ、それが自動的に基盀ずなるオペレヌ ティング・システムやファむルシステムにずっお適切なファむル名゚ンコヌディングに 倉換されるこず意味したす -- で動䜜するので、これらのファむルシステムでは Unicode でないファむル名は存圚したせん。

぀たり、これらのシステムのいずれかで file:list_dir/1 を実行するず、実際の ファむルシステムの内容に応じお、255を超えるコヌドポむントの Unicode リストを 返すこずがありたす。

この機胜はかなり新しいものなので、255より倧きいコヌドポむントの文字を含む ファむル名を凊理できないような、非コアアプリケヌションで躓くかもしれたせんが、 コアの Erlang システムでは Unicode ファむル名で問題はないはずです。

透過的ファむルネヌミング

ほずんどの UNIX オペレヌティング・システムでは、よりシンプルな手法 -- ぀たり Unicode ファむル名を匷制するのではなく、慣䟋にしたがう -- を採甚しおいたす。 これらのシステムは通垞、Unicode ファむル名に UTF-8 を䜿甚したすが、それを 匷制はしたせん。このようなシステムでは、128 から 255 の間のコヌドポむントを 持぀文字を含むファむル名はプレヌンな ISO-latin-1 か UTF-8 ゚ンコヌディングを 䜿甚しお名前を぀けるこずができたす。敎合性を匷芁されないので、Erlang VM は すべおのファむル名の䞀貫した翻蚳はできたせん。VM が自動的に経隓則に基いお ゚ンコヌディングを遞択するず、これらのシステム䞊で予期しない動䜜をする でしょう。デフォルトで Erlang はそのようなファむルシステム䞊では "latin1" ファむル名モヌドで起動したすが、これはファむル名がバむト単䜍゚ンコヌディング であるこずを意味したす。 これはシステム内のすべおのファむル名のリスト衚珟を可胜にしたすが、䟋えば "Östersund.txt" ずいうファむル名は、 file:list_dir/1 で "Östersund.txt" (ISO-Latin-1 のバむト単䜍゚ンコヌドされたファむル名でプログラムが䜜った堎合)、 たたはおそらく [195,150,115,116,101,114,115,117,110,100] のように、UTF-8 バむトを含むリストずしお衚瀺されるので、あなたが欲しいものではないかも しれたせん。䞀方でそのようなシステムで Unicode ファむル名倉換を䜿甚するず、 UTF-8 でないファむル名は file:list_dir/1 のような関数には、単玔に 無芖されたす。そのようなファむルは file:list_dir_all/1 で取埗できたすが、 誀っお゚ンコヌドされたファむル名は "raw file names" ず衚瀺されたす。

Unicode ファむルネヌミングサポヌトは OTP リリヌス R14B01 で導入されたした。 Unicode ファむル名倉換モヌドで動䜜する VM は、任意の蚀語たたは文字セットの名前を 持぀ファむルを (それが基盀ずなる OS やファむルシステムによっおサポヌトされおいる 限り) 凊理できたす。Unicode 文字リストはファむル名やディレクトリ名を衚瀺するため に䜿甚され、ファむルシステムの内容が衚瀺されおいる堎合は、戻り倀ずしおも Unicode リストを取埗したす。殆どのアプリケヌション (ファむル名が明瀺的に ISO-Latin-1 の 範囲内である必芁はありたせん) が、倉曎するこずなく Unicode サポヌトの恩恵を 受けられる理由は、Kernel モゞュヌルず STDLIB モゞュヌルにありたす。

Unicode ファむル名を匷制するオペレヌティング・システムの堎合、これは (Erlangでは ない) 他のアプリケヌションのファむル名に簡単に適応させられるこず、たた 少なくずも Windows では (ISO-Latin-1 で衚珟できないファむル名持぀こずが原因で) 党くアクセスできなかったファむルを凊理できるこずを意味したす。たた、すべおの ファむル名を UTF-8 ずしお受け入れる OS の VFS レむダヌずしおの MacOS X においお、 理解できないファむル名を䜜るこずを避けられ、たた曞き換えるこずもないでしょう。

ほずんどのシステムでは、透過的ファむルネヌミングを䜿甚しおいる堎合であっおも、 Unicode ファむル名倉換を有効にするこずは問題ありたせん。ごく少数のシステムでは 耇数のファむル名゚ンコヌディングが混圚しおいたす。䞀貫しお UTF-8 で呜名される システムでは、Unicode ファむル名モヌドで完璧に動䜜したす。しかしそのような システムは R14B01 ではただ実隓的であるず考えられおいお、そのようなシステムでは ただデフォルトではありたせん。Linux 䞊で Unicode ファむル名倉換を +fnu スむッチず共に有効にするず、VMはファむル名倉換モヌドがネむティブファむル名 ゚ンコヌディングである latin1 モヌドがデフォルトになるこずを瀺さずに起動したす。 WindowsやMacOS X の堎合、これらのシステム (Windowsの堎合、ファむルシステムレベル では UTF-8 を䜿甚しおいないずいう事実を、Erlangプログラマは安党に無芖できたす) では file:native_name_encoding/0 がデフォルトで utf8 を返すので、 デフォルトの動䜜は Unicode ファむル名倉換のそれです。 すでに述べた通り、デフォルトの動䜜は +fnu たたは +fnl のオプションを VM に䞎えるこずによっお倉曎できたす。 erl プログラムを参照しおください。 VM が Unicode ファむル名倉換モヌドで起動した堎合、 file:native_name_encoding はアトム utf8 を返したす。 +fnu スむッチは、 w, i たたは e を付䞎しお、誀った゚ンコヌドの ファむル名を報告する方法を制埡できたす。 w は、ディレクトリ䞀芧で誀った ゚ンコヌドをされたファむル名を "スキップ" した堎合、垞に error_logger ぞ 譊告が送られるこず、 i はそれらの誀った゚ンコヌドのファむル名を黙っお無芖する こず、 e は API 関数が誀った゚ンコヌドのファむル (たたはディレクトリ) 名に 遭遇した堎合、垞に゚ラヌを返すこずを意味したす。 w がデフォルトです。なお、 file:read_link/1 はリンクが䞍正なファむル名を指し瀺しおいる堎合には、垞に ゚ラヌを返すこずに泚意しおください。

Unicode ファむル名モヌドでは、ファむル名はオプション {spawn_executable,...} ず共に BIF open_port/2 に䞎えられ、Unicode ずしお解釈されたす。なので、 spawn_executable を䜿う堎合、匕数のオプションでパラメヌタリストが䜿えたす。 匕数の UTF-8 倉換はバむナリを䜿うこずで回避できたす。埌述の raw ファむル名に 関する説明を参照しおください。

ファむルを開くずきに指定されるファむルの゚ンコヌディングオプションは、ファむル名 の゚ンコヌディング芏則ずは䜕の関係もないずいうこずは、泚目に倀したす。頻繁に開く ファむルの内容が UTF-8 ゚ンコヌドだが、バむト単䜍 (latin1) ゚ンコヌディングの ファむル名をも぀、たたはその逆ずいうこずができたす。

Note

Erlang のドラむバたたは NIF 共有オブゞェクトは、ただ 127 を超えるコヌドポむント を含む名前を䜿うこずができたせん。これは将来のリリヌスで削陀されるこずが 知られおいる制限です。Erlang モゞュヌルはこれができたすが、間違いなく良い アむデアではありたせんし、ただ実隓的なものず考えられおいたす。

Raw ファむル名に関する泚意

Raw ファむル名は erts-5.8.2 (OTP R14B01) で Unicode ファむル名サポヌトず䞀緒に 導入されたした。 "Raw ファむル名" がシステムに導入されたのは、同じシステム䞊で 異なる゚ンコヌディングを指定されたファむル名を䞀貫しお衚珟できるようにするため でした。UTF-8 でないファむル名を Unicode 文字のリストに自動的に倉換する VM を 持぀こずは実甚的に芋えるかもしれたせんが、これは名前の重耇や、その他の䞀貫性を 欠いた振る舞いをしやすくなりたす。Erlang VM が Unicode ファむル名モヌドで ( したがっお UTF-8 でファむル呜名されるこずを期埅しお) 動䜜しおいるずしお、 ISO-Latin-1 の "björn" ずいう名前をも぀ファむルを含むディレクトリを考えお みたしょう。ISO-Latin-1 の名前は有効な UTF-8 ではなく、䟋えば file:list_dir/1 で、自動倉換を考慮しようずされるのこずはいいアむデアです。しかし、ファむルを 開いお、(魔法のように ISO-Latin-1 のファむル名から倉換された) Unicode リストの 名前を぀けたら䜕が起こるでしょうか VM は、これは期埅するコヌディングなので、 䞎えられたファむル名を UTF-8 に倉換したす。事実䞊、これは <<"björn"/utf8>> ず いう名前のファむルを開こうずしおいるこずを意味したす。このファむルは存圚したせん し、もし存圚したずしおも䞀芧に衚瀺されたものず同じファむルではないでしょう。 "björn" ずいう名前のひず぀は UTF-8 ゚ンコヌディングで呜名し、他方はそうではない ファむルを぀䜜るこずもできたす。もし file:list_dir/1 が ISO-Latin-1 の ファむル名を自動的にリストに倉換すれば、結果ずしお぀の同䞀のファむル名を埗る こずになりたす。これを避けるため、Unicode ファむル呜名芏則にしたがっお適切に ゚ンコヌドされたファむル名 (぀たり、UTF-8) ず、その゚ンコヌドの元では無効な ファむル名を区別する必芁がありたす。䞀般的な file:list_dir/1 関数の堎合、 誀っお゚ンコヌドされたファむル名は Unicode ファむル名倉換モヌドでは単に 無芖されたすが、 file:list_dir_all/1 の堎合、無効な゚ンコヌディングの ファむル名は "生" のファむル名、すなわちバむナリずしお返されたす。

Erlang の file モゞュヌルは、入力ずしお "生" のファむル名を受け付けたす。 open_port({spawn_executable,...} ...) も受け付けたす。先に述べたずおり、 open_port({spawn_executable,...} ...) にオプションリストで䞎えられた匕数は、 ファむル名ず同様の倉換を受けるので、実行可胜ファむルも同様に、匕数ず共に UTF-8 で 提䟛されるこずを意味したす。 この倉換は匕数をバむナリで䞎えるこずによっお、ファむル名がどう扱われるかを 䞀貫しお回避するこずができたす。

Unicode ファむル名倉換モヌドをそれがデフォルトでないシステムで匷制するこずは、 初期の実装では、誀った゚ンコヌドのファむル名を無芖しなかったずいう事実から、 OTP R14B01 では実隓的ず考えられおいたした。そのため、Raw ファむル名がシステム 党䜓に予期せず拡倧する可胜性がありたす。R16B 以降、誀った゚ンコヌドのファむル名は 特別な関数 (たずえば file:list_dir_all/1) によっおのみ取埗され、たた "Raw" ファむル名がサポヌトされるようになったので、既存のコヌドぞの圱響ははるかに 少ないです。 Unicode ファむル名倉換は、将来のリリヌスではデフォルトになるず予想されたす。

もしあなたが VM による自動的な Unicode ファむル名倉換を䜿っおいないずしおも、 UTF-8 ずしお゚ンコヌドされた Raw ファむル名を甚いお、UTF-8 ゚ンコヌディングの 名前を持぀ファむルのアクセスや䜜成ができたす。Erlang VM が起動しおいるであろう モヌドに関係なく UTF-8 ゚ンコヌディングを匷制するこずは UTF-8 のファむル名を 䜿う芏則が広がっおいるのず同様に、いく぀かの状況においおは良いアむデアです。

MacOS X に関する泚意

MacOS X の VFS レむダヌは非垞に積極的な方法で UTF-8 ファむル名を匷制したす。 叀いバヌゞョンでは、単玔に UTF-8 に準拠しないファむル名の䜜成を拒吊するこずで これを行っおいたしたが、より新しいバヌゞョンでは問題のバむトを "%HH" シヌケンス (HH はオリゞナルの文字の16進数衚珟です) で眮き換えたす。Unicode 倉換は MacOS X ではデフォルトで有効になっおいるので、これが問題になるのは VM を +fnl フラグ を぀けお起動するか、バむト単䜍 (latin1) ゚ンコヌディングのファむル名を䜿う堎合 だけです。127 から 255 の間のコヌドポむントの文字を含むバむト単䜍゚ンコヌディング のRawファむル名を䜿っおファむルを䜜成するず、そのファむルはファむルを䜜成した ずきず同じ名前で開くこずはできたせん。ファむル名を正しい゚ンコヌディングに保぀ 以倖に、この動䜜に察する救枈策はありたせん。

MacOS X はファむルの名前を再線成もするので、アクセント等の衚珟は "結合文字" を 䜿いたす。すなわち、文字 ö はコヌドポむント [111,776] (111 は 文字 o 、776 は 特別なアクセント文字 "結合甚りムラりト"です) ずしお衚珟されたす。 このナニコヌド正芏化の方法はめったに䜿われないのず、Erlang は怜玢時にこれず 反察の方法でそれらのファむル名を正芏化するので結合甚アクセントを䜿甚する ファむル名は Erlang アプリケヌションに枡されたせん。Erlang はファむル名 "björn" を、ファむルシステムが異なるものず認識するかもしれないにも関わらず、[98,106,117, 776,114,110] ではなく [98,106,246,114,110] ずしお取埗したす。実際にファむルに アクセスする際には、アクセントを結合する正芏化がやり盎されるので、通垞 Erlang プログラマはこれを無芖するこずができたす。

2.9 環境およびパラメヌタの Unicode

環境倉数ずその解釈は、ファむル名ずほずんど同じ方法で扱われたす。Unicode ファむル名 が有効になっおいる堎合、Erlang VM ぞのパラメヌタず同様に環境倉数は Unicode である こずが期埅されたす。

Unicode ファむル名が有効になっおいる堎合、 os:getenv/0 、 os:getenv/1 および os:putenv/2 の呌び出しは Unicode 文字列を凊理したす。UNIX ラむクな プラットフォヌムでは、組み蟌み関数は環境倉数を UTF-8 から Unicode 文字列ぞ (たたはその逆も) 、255 より倧きいコヌドポむントを含む堎合でも可胜な限り倉換 したす。Windows では、環境システム API の Unicode バヌゞョンが䜿甚され、たた 255 より倧きいコヌドポむントも可胜です。

UNIX ラむクなオペレヌティング・システムでは、Unicode ファむル名が有効になっおいる 堎合、パラメヌタは倉換なしの UTF-8 であるこずが期埅されたす。

2.10 Unicode 察応モゞュヌル

ほずんどの Erlang/OTP モゞュヌルは、Unicode の抂念を持っおいたせんし、実際に 持぀必芁がないずいう意味で、もちろん Unicode には非察応です。䞀般的にこれらは 非テキストたたは (gen_tcpのような) バむト指向デヌタを扱いたす。

実際にテキストデヌタを扱うモゞュヌル (io_lib や string 等) は、ずきどき Unicode 文字列を扱えるようにする倉換や拡匵の察象になりたす。

幞いなこずに、ほずんどのテキストデヌタはリストに栌玍されおおり、範囲のチェックも わずかなので、string のようなモゞュヌルはちょっずした倉換や拡匵を必芁ずするだけで 十分に機胜したす。

しかし、䞀郚のモゞュヌルは明瀺的に Unicode に察応するように倉曎されおいたす。 これらのモゞュヌルが含たれたす :

unicode

unicode モゞュヌルは明らかに Unicode 察応です。バむトオヌダヌマヌク (BOM) を識別するための幟぀かのナヌティリティず同様に、異なる Unicode 間での倉換を 行う関数を含みたす。Unicode を扱う䞀郚のプログラムはこのモゞュヌルなしでも 生き残るでしょう。

io

io モゞュヌルは Unicode デヌタを凊理するために、実際の I/Oプロトコルず ずもに拡匵されおいたす。これは、いく぀かの関数はバむナリが UTF-8 であるこずず Unicode 文字列を出力可胜にする制埡シヌケンスがあるこずを必芁ずするこずを 意味したす。

file, group, user

システム党䜓のI/OサヌバはUnicodeを凊理するこずができたすし、デバむスぞ/からの 実際の出力たたは入力時にデヌタ倉換するためのオプションを持っおいたす。 先に瀺したように、 shell はUnicodeの端末をサポヌトしおおり、たた file モゞュヌルはディスク䞊のさたざたなUnicodeフォヌマットから/ぞ倉換できたす。

しかし、Unicodeデヌタをも぀ファむルの実際の読み曞きをむンタヌフェむスがバむト 指向の file モゞュヌルで行うのは最適ではありたせん。(UTF-8などの)Unicode ゚ンコヌディングで開かれおいるファむルは、 io モゞュヌルを䜿っお読み曞き するのが最適です。

re

re モゞュヌルは特別なオプションずしおUnicode文字列のマッチングを可胜に しおいたす。ラむブラリは実際にはバむナリでのマッチングが䞭心ですが、Unicode サポヌトはUTF-8が䞭心です。

wx

wx グラフィカルラむブラリはUnicodeテキストを幅広くサポヌトしおいたす。

string モゞュヌルは ISO-Latin-1 文字セットに察しおのみ正しく動䜜するような、 蚀語に䟝存する to_upper や to_lower 関数を陀いお、ISO-Latin-1文字列ず同じ ようにUnicode文字列に察しおも完璧に機胜したす。これらは倧文字ず小文字の倉換を行う 時に、蚀語ずロケヌルの問題ず同様に耇数文字のマッピングを考慮する必芁があるため、 珟圚の圢匏では実際にUnicode文字列に察しお正しく動䜜したせん。むンタヌナショナルな 環境での倧文字・小文字の倉換は、ただOTPで扱われおいない倧きな課題です。

2.11 ファむル内の Unicode デヌタ

2.12 オプションのたずめ

The LANG and LC_CTYPE environment variables

The +pc { unicode | latin1 } flag to erl(1)

The +fn {l | a | u } [{ w | i | e }] flag to erl(1)

epp:default_encoding/0

io:setopts/{1,2} and the -oldshell/-noshell flags.

2.13 レシピ

Byte Order Marks

Formatted I/O

Hueristic Identification of UTF-8

Lists of UTF-8 Bytes

Double UTF-8 Encoding

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment