私は最近 Go の UTF-8 サポートを調査しており、コード内で非ラテン語スクリプトがどの程度適切に処理されるかについて興味がありました。
UTF-8 を使用してください
Go ソース ファイルはデフォルトで UTF-8 でエンコードされます。これは、理論上、変数名や関数名などに Unicode 文字を使用できることを意味します。
たとえば、公式 Go プレイグラウンドの定型コードでは、次のようなコードが見つかる可能性があります。
ここで、消息は中国語で「メッセージ」を意味します。 Go は Unicode サポートのおかげで、これを問題なく処理します。この機能は、Go が中国や日本などの国で人気を集めている理由の 1 つであり、開発者は自国の言語で意味のある識別子を使用してコードを作成できます。信じられないかもしれませんが、中国では母国語でコードを書くことが非常に人気があり、私はそれが大好きです。
タミル語識別子を使用しようとしています
当然、母国語であるタミル語でこれを試してみたかったのです。
これが私が書いた簡単な例です:
一見すると、これはエラーなしで実行できる簡単なように見えます。
しかし、コードをコンパイルしようとするとエラーが発生しました
タミル語結合記号の問題を理解する
何が起こっているのかを理解するには、タミル語文字がどのように機能するかを少し知ることが不可欠です。
タミル語は アブギダ、つまり各子音と母音のシーケンスが単位として書かれる表記法です。 Unicode では、これには多くの場合、基本子音文字と、母音やその他の修飾子を表す 1 つ以上の結合記号を組み合わせることが含まれます。
例:
タミル語の文字 க (U 0B95) は子音「ka」を表します
「き」を表すには、க と母音記号 ி (U 0BBF) を組み合わせて、கி となります。
母音記号 ி は結合記号であり、特に Unicode では「非スペース記号」として分類されます。
ここで問題が発生します。
Go の言語仕様では、識別子に Unicode 文字を使用できますが、結合記号は除外されています。具体的には、識別子には、「文字」として分類される文字 (カテゴリ Lu、Ll、Lt、Lm、Lo、または Nl) と数字を含めることができますが、結合記号 (カテゴリ Mn、Mc、Me) は含めることはできません。
タミル語での記号の組み合わせの例
タミル文字がどのように形成されるかを見てみましょう:
スタンドアロン子音: க (U 0B95) - Go 識別子で許可されます。
子音母音記号: கா (U 0B95 U 0BBE) - ா (U 0BBE) は結合記号 (Mc) であるため許可されません。
子音母音記号: கி (U 0B95 U 0BBF) - ி (U 0BBF) は結合記号 (Mn) であるため許可されません。
子音母音記号: கூ (U 0B95 U 0BC2) - ூ (U 0BC2) は結合記号 (Mc) であるため許可されません。
識別子 எண்ணிக்கை (「数値」) の文字には結合記号が含まれます。
எ (U 0B8E) - 手紙、許可されています。
ண் (U 0BA3 U 0BCD) - ண (U 0BA3) と virama ் (U 0BCD)、結合記号 (Mn) によって形成されます。
ண (U 0BA3) - 手紙、許可されています。
ிக்கை - ி (U 0BBF) や ை (U 0BC8) などの結合記号が含まれます。
これらの結合マークは Go 識別子では許可されないため、コンパイラーはそれらを検出するとエラーをスローします。
なぜ漢字は機能するのにタミル語は機能しないのか
漢字は通常、Unicode では「文字、その他」(Lo) カテゴリに分類されます。これらはスタンドアロンのシンボルであり、完全な文字を形成するためにマークを組み合わせる必要はありません。これが、消息のような識別子が Go で完璧に機能する理由です。
実際的な意味
識別子で結合マークを使用できないことは、タミル語のような文字に重大な影響を及ぼします。
表現力の制限: マークを結合しないと、タミル語で意味のある識別子を記述することはほぼ不可能です。
教育上の障壁: ネイティブ スクリプトを使用するとコードの学習が容易になりますが、特に abugida ベースの書記体系に従う言語では、これらの制限がその可能性を妨げます。
包括性の課題: Go は UTF-8 サポートにより包括性を目指していますが、マークの結合に関する制限により、マークに依存する多くの言語が除外されます。
Go の UTF-8 サポートは、プログラミングをより包括的なものにするための大きな一歩です。ただし、識別子で結合マークを除外すると、タミル語、ヒンディー語、アラビア語など、結合マークがスクリプトに不可欠な言語では障壁が生じます。
タミルナドゥ出身の開発者として、主に Go で働いていましたが、この発見は刺激的であり、少し残念でもありました。これは、プログラミング言語における真の国際化の複雑さを浮き彫りにしています。
もちろんです!東アジア地域は例外ではなく、「アブギダ」ベースの文字体系が採用されていません。
そして明らかに、Go の作成者は、最初から「ネイティブ言語コーディング」に UTF-8 準拠を意図していなかったでしょう。その理由は、より優れた ASCII 処理、最新の Web 標準との整合、一貫した文字列処理、および相互運用性への一歩を提供することにありました。
この試みは、Go で UTF-8 準拠をどこまで実現できるかを理解するという私の単なる好奇心でした。 Go でスケーラブルな分散フィンテック システムの構築に取り組んでいる者として、私はこれらのニュアンスを認識することが不可欠であると感じました。
以上です。最後までお読みいただきありがとうございます。
コーディングを楽しんでください :) コードがあなたとともにありますように。
以上がGo の UTF サポート: 興味深い制限の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。