文字の種類 - 言語の基本的な種類をオンに行きます

https://blog.csdn.net/FHD994603831/article/details/92435724

 

 

 

文字タイプ
Golang特別な文字の種類、あなたは一般的にバイトを格納するために使用される単一の文字(文字)を保存したい場合。
文字列は、文字列を連結する固定長の文字列です。文字列はシングルバイトで接続されている移動します。それは文字で構成され、伝統的な文字列、および異なるゴー文字列で、それはバイトです。

Unicodeの
情報交換用米国標準コード:ずっと前に、世界はまだ比較的簡単ですが、少なくとも、1台のコンピュータでは、世界のASCII文字セットにあります。英語のアルファベット、数字、句読点やデバイス制御文字の場合:ASCIIは、より正確に、米国のASCIIは、128個の文字を表す7ビットを使用します。初期のコンピュータ・プログラムの場合、これらは十分であろうが、それはまた、多くのユーザーが直接シンボルの独自のシステムを使用することができません世界の他の部分につながりました。インターネットの発展に伴い、複数の言語で混合データは非常に一般的になってきた(翻訳:例えば、英語のテキスト自体または中国語の翻訳はASCII、中国語、日本語と他の言語の文字が含まれています)。効果的にこれらに対処する方法、それは豊かな言語のテキストデータの様々なが含まれていますか?

答えアクセントや他の発音区別符号、タブ、改行を含め、世界のシンボルシステムのすべてを収集ユニコード(http://unicode.org)を使用することで、多くの神秘的なシンボルが存在し、各シンボルは、固有のコード・ポイントが割り当てられるユニコード、型ルーン移動言語を整数に対応するUnicodeコードポイント(注釈:ルーンが同等タイプINT32です)。

私たちは、100以上の言語をカバーし、第八のUnicode標準バージョンで12万個の以上の文字を収集しました。これらのコンピュータプログラムやデータは、それを具現化する方法ですか?一般的な、すなわち言語タイプ囲碁ルーンに対応する、Unicodeコードポイントデータ型INT32を表し、それはルーン意味同義ルーンあります。

私たちは、ルーンのINT32シーケンスはシーケンスとして表現されることができます。このエンコーディングは、UTF-32またはUCS-4と呼ばれ、各32ビットUnicodeコードポイントは、同じ大きさを表すために使用されます。それは、よりシンプルかつ均一だが、それは、ストレージスペースの多くを無駄になり、ほとんどのコンピュータ読み取り可能なテキストはASCII文字であるため、それぞれが8ビットまたはASCII文字は1バイトのみを表すことができました。さらには通常の文字を使用すると、16ビットの符号化表現一般的に使用される文字を使用できることを意味し、また、65,536よりもはるかに少ないです。しかし、他のよりよいコーディングアプローチがあるのですか?

UTF8は、
UnicodeコードポイントにUTF8は、符号化されたバイトの可変長コード配列です。UTF8エンコーディングが行く言語ケン・トンプソンとロブ・パイクの共同発明者の父で、今はUnicodeの規格です。各Unicodeコードポイントを表すために、1-4バイトを使用してUTF8エンコーディング、ASCII文字のみを1バイト、一般的に使用される文字部2または3バイトの一部。総バイト数を符号化ビットを表すために使用される各シンボルの符号化された高ビット後の最初のバイト。ハイエンドビットの最初のバイトが0の場合、対応する7ビットのASCII文字である場合、各文字のASCII文字は依然としてバイトであり、伝統的なASCIIコード互換。最初のバイトの上位ビットが110である場合、それは2つのバイトを必要とする後続の各端部10は、ビットから始まります。より多くのUnicodeコードポイントは、同様のポリシーの処理です。

0~127ルーン0xxxxxxx(ASCII)
110xxxxx 10xxxxxxに128から2047(値<128未使用)
1110xxxx 10xxxxxxに10xxxxxxに2048から65535(値<未使用2048)
11110xxx 10xxxxxxに10xxxxxxに10xxxxxxに65536-0x10ffff(OTHER未使用の値)
。1
2
。3
。4
長くなります直接インデックスを介して第1のn文字にアクセスすることはできませんコーディングが、UTF8エンコーディングは、余分な利点の多くを取得します。第UTF8エンコーディングはASCIIコードと完全に互換性が、比較的コンパクトであり、かつ自動的に同期することができる:前方に3つのバイトまで後戻りして、現在の開始バイト文字コードの位置を決定することができます。また、接頭コードなので、何の曖昧さは左から右に(翻訳:あなたは、開始位置が曖昧さを生じることがわからない場合など、GBK符号化)を復号する際に先読みする必要はありませんが存在します。ノー文字限り、検索は検索結果が干渉を心配する必要は文脈の前と後の文字にそのバイトコード配列を検索して、他のコード化された文字の部分文字列、文字列または他のコーディング配列をコードします。同じ配列ながら配列UTF8 Unicodeコードポイントを符号化するので、直接UTF8コード配列をソートすることができます。同時に列のNUL端も互換プログラミング言語とすることができるいかなる埋め込みNUL(0)バイトが存在しないからです。

ゴーUTF8エンコーディングUTF8エンコーディング、言語処理やテキストを使用して言語のソースファイルを行くにも非常に良いです。Unicodeのパッケージは多くの機能を(文字と数字、文字、または大文字と小文字の変換を区別するなど)、ユニコード/ UTF8パッケージが符号化および復号ルーンUTF8文字列のための機能を提供するルーン文字処理に関連する機能を提供します。

いくつかさえ見えない文字(:中国語と日本語は似ているが異なる単語がたくさんある注釈)は、キーボードから直接多くの困難のUnicode文字があり、文字の多くは同様の構造を有しているがあります。我々はUnicodeコードポイントを介して特殊文字を入力できるようにUnicodeのエスケープ言語の文字列リテラルを移動します。2つの形式があります:\ uhhhh \ Uhhhhhhhhコードポイントhは16進数である32ビット値に対応するコードポイントに対応する16ビット値が、まれに32ビットのフォームを使用する必要はありません。各コードポイントUTF8エンコードに対応します。例:以下の文字列は、同じ額面金額を表します。

"世界"
"\ XE4 \ XB8 \ X96 \ XE7 \ X95用の\ x8c"
は"\ u4e16のの\ u754c"
「\ U00004e16 \ U0000754c "
。1
2
。3
。4
3つのエスケープシーケンス上では、最初の文字列への代替表現を提供するために、しかしその値は同じです。

Unicodeのエスケープはルーン文字でも使用することができます。次の3つの文字は等価です。

「世界」「\ u4e16」「\ U00004e16」
。1
未満256がX41に対応する文字「A」\例えば、バイトの16進数エスケープに書き込まれてもよい点値コードが、大きなコードポイントのためのuまたは\ Uがフォームをエスケープ\あなたが使用する必要があります。したがって、\ xe4 \ xb8これら三つのバイトが有効なコードポイントのUTF8エンコーディングに対応するが、X96のルーンは、有効な文字ではありません\。

おかげでUTF8エンコーディング優れたデザイン、多くの操作は、文字列操作をデコードする必要はありません。私たちは、直接文字列が別の文字列の接頭辞であるかどうかをテストデコードすることはできません。

HasPrefix FUNC(S、文字列の接頭辞){BOOLの
戻りLEN(S)> = LEN(接頭辞)&& S [:LEN(接頭辞)] ==プレフィックス
}
。1
2
。3
又は接尾試験:

HasSuffix FUNC(S、文字列のサフィックス){BOOLの
戻りLEN(S)> = LEN(サフィックス)&& S [LEN(S)-len(サフィックス):] ==サフィックス
}
。1
2
3。
またはテストを含むストリング。

{FUNCは(S、SUBSTR文字列)BOOLを含み
; Iがlen <(S)= 0 I ++ {Iため
IF HasPrefix(S [I:]、SUBSTR){
trueに戻り
}
}
偽に戻り
}
。1
2
。3
。4
。5
。6
7
。8
後処理およびエンコードUTF8の元バイトのテキスト処理ロジックは同じです。しかしながら、符号化に対応する多くの他はそうではありません。(パケット列列から上記の処理機能は、コードは、真の最適化手法は、ハッシュの実装が含まれて含まれています。)

私たちは本当にそれぞれのUnicode文字を気一方、我々は他の治療法を使用することができます。それは中国と西洋の文字の混合物である、上記の文字列の最初の例を考えてみましょう。図3.5は、メモリ表現を示しています。ストリングは、UTF-8形式でコード化された13のバイトを含んでいるが、唯一のUnicode文字は、9に対応します。

インポートの"Unicode / UTF8"
S:= "こんにちは、世界"
fmt.Println(LEN(S))// "13は"
「。9" fmt.Println(utf8.RuneCountInString(S))//
1。
2
3。
4。
処理します正体は、我々はUTF8デコーダが必要です。ユニコード/ UTF8パッケージがこの機能を提供し、我々は使用することができます。

I用:= 0;私は(S)でlen <; {
R&LT、サイズ:utf8.DecodeRuneInString =(S [I:])
fmt.Printfを( "%D \ T%C \ N-"、I、R&LT)
I +サイズ=
}
。1
2
。3
。4
。5
機能をDecodeRuneInString各コール戻り、長さr、R文字自体に対応する、符号化されたバイトのUTF8エンコーディングの数を使用して、長さrに対応します。バイト長は、文字列のi番目の文字のインデックス位置を更新するために使用されてもよいです。しかし、このコーディングは厄介で、我々はより簡潔な構文が必要です。文字列を扱うときに幸いなことに、レンジサイクルが自動的にUTF8文字列をデコードし、暗黙的、言語を移動します。図3.5に示されている次の動作サイクル;非ASCII、1バイトより大きいインデックス更新ステップサイズのためにことに留意されたいです。


iについて、R:=範囲"こんにちは、 世界" {
fmt.Printf( "%のTの%Qは\%T D \ N-D \"、Iは、R、R&LT)
}
。1
2
。3
我々は、単純なループを使用することができこのような文字列の文字数の統計:

N- = 0
_、_の範囲は= {S
N - ++
}
1
2
3。
4。
我々は不要な変数を無視することができ、サイクルの他の形態のように:

N- = 0
レンジS {ための
N - ++
}
。1
2
。3
。4
、または我々は、(複数の)関数をutf8.RuneCountInString直接呼び出すことができます。

我々は先に述べたように、UTF8エンコーディングを使用してテキスト文字列は単なる慣習ですが、実際の文字列のループのために、それは権利条約のではありません。普通のバイナリデータ、またはUTF8でエンコードされたデータの文字列ループはエラーが含まれている場合、何が起こるのだろうか?

明示的または黙示的に各UTF8文字エンコーディングは、範囲内のサイクルをデコードするutf8.DecodeRuneInStringデコーダを呼び出すあなたは間違ってUTF8エンコードの入力が発生した場合、それは印刷で、uFFFD \特殊なUnicode文字を作成します。このシンボルは、通常、白い疑問符が含まれている黒の六角形や菱形、あります「?。」プログラムは、入力が完璧なエラー-UTF8文字列ではないことを示し、そのような文字、通常は危険信号を検出すると。

UTF8文字列交換フォーマットは、非常に便利であるが、プログラム内のルーン・シーケンスを使用するルーン同じ大きさ、および容易な切断支持配列インデックスので、より便利であり得ます。

[]ルーンの型変換は、UTF8エンコードされた文字列に適用され、文字列がエンコードされたUnicodeコードポイントのシーケンスを戻されます。

日本語カタカナで// "プログラム"
S:= "プロトンジュエリーは、ルソーの取得"
fmt.Printf( "%X \ N-"、S)// "E3 83 97 E3 83 AD E3 82 B0 E3 83 A9 E3 83 A0"
R&LT:= [ ]ルーン(S)
fmt.Printf( "%X \ N-"、R&LT)// "[30d7 30ed 30b0 30e9 30e0]"
。1
2
。3
。4
。5
(X%でのprintfのそれぞれの最初のパラメーターに進数は、前にスペースを挿入します。)

スライス、または[]型の列にルーン、UTF8は、それらをコードするUnicode文字の配列の場合:

fmt.Println(ストリング(R))// 「 プロトンジュエリーはルソーを取得」
1は
、整数変換の文字列になりますは、UTF8文字列がUnicodeコードポイントに対応する文字だけが含まれて発生することを意味します。

fmt.Println(文字列(65))// "A"、ない"65"
fmt.Println(文字列(0x4eac))// "バージン"
。1
2
コードポイントに対応する文字が無効である場合には、使用\ uFFFD無効代替文字として:

fmt.Println(文字列(1234567))//「?」
。1つの
文字タイプの詳細
文字定数は、単一引用符(「」)されている単一の文字を囲みます。VaRのC1バイト= '':例えば 'VAR c2はint型= VARのC3バイト=における' '9' 。
ゴーは文字定数への特殊文字の後にエスケープ文字を「\」許可されています。たとえばます。var C3の文字は= '\ nは ' // '\ n'は改行を表します。
UTF-8エンコーディング使用言語の文字を移動し
、アルファベット文字を-3 -1バイトバイト
移動で、キャラクタの性質は、直接出力コード値を、対応するUTF-8文字でエンコードされた整数です。??? [ASCII、ユニコード、UTF- 8]。

直接、変数に数値を割り当て、次いで、出力フォーマット%のC、Unicode文字を対応するデジタル出力を押すことができます。

文字型の操作は、それが持っているため、Unicodeコードに対応する、整数の等価物を作製することができます。


違いUTF-8とUnicodeとは何ですか?
Unicodeは、ASCII文字セットで、文字セットです。

各文字は、文字セットの一意のIDが割り当てられ、我々はUnicodeでエンコードされた上記の例では、Unicode文字セット内のすべての文字たとえばに対応する固有IDを、持っているを使用し、97はASCIIです。Unicodeエンコーディングでは、「あなた」は20320ですが、さまざまな国の文字に焦点を当てた、「あなたは」IDは異なります。かかわらず、いずれの例、Unicode文字はIDが変更されませんです。

UTF-8エンコーディング規則、何らかの方法でエンコードされたUnicode IDの文字。UTF-8は、1から4バイトまでの範囲の、可変長符号化ルールです。次のように符号化規則は以下のとおりです。

0xxxxxxテキストシンボル127に0を表し、ASCII文字セットと互換性があります。
128からから0x10FFFFに他の文字を表します。
この規則によると、一般的にラテン語の文字エンコーディングの下で、各文字はまだ1つのバイトを占有し、中国の各文字は3つのバイトを占めます。

これは、定義された広いユニコード標準文字セットと符号化規則、すなわち、Unicode文字セット、及びUTF-8、UTF-16符号化を指します。

参考文献:
「言語の聖書を行く」:HTTPS://github.com/994603831/gopl-zh.github.com
----------------
免責事項:この記事はCSDNブロガーであります元の記事の「氷の北旋風」、BY-SAの再現著作権契約、CC 4.0に従って、元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/FHD994603831/article/details/92435724

おすすめ

転載: www.cnblogs.com/saolv/p/11795928.html