2011-01-29 22 views
3

)同様のについては、StackOverflowで質問されていますが、正確ではありません。最も近いものはおそらく "javascript how to convert unicode string to ascii"で、 "これはdup [licate]"である必要があります。私は非常に良いW3Schoolsサイトを見てきましたが、グーグルもありますが、答えが見つからないので、ここのヒントは非常に高く評価されるでしょう。)JavaScriptの文字列からASCIIコードを取得するにはどうすればよいですか?


私は、JavaScriptの配列にバイトの配列を渡しています。 JavaScriptでは、データは文字列で到着します。転送の仕組みはわかりません。第三者のアプリケーションだからです。文字列が「ワイド」か「ナロー」かはわかりません。

私のJavaScriptでは、b = str.charCodeAt(pos);のようなコードがいくつかあります。

私の問題は、0x86 = 134などのバイト値が文字0x2020 = 8224として伝わるということです。これは、元のバイトがLatin-1(おそらく)の「短剣」文字として解釈され、同等のUnicodeコードポイントに変換されます。 (問題はJavaScriptの 'fault'かもしれません)。0x00..0x7Fと0xA0..0xFFの範囲は問題ないようですが、0x80..0x9Fのほとんどの値が影響を受けますが、他の値でも同様の問題が発生します。それぞれの場合、値は元のLatin-1のUnicodeのようです。

長さがバイト単位で測定された場合、文字列の長さは狭い文字列に対して期待されるものです。 (一方、長さが抽象的な文字で値を返す場合、これは何も教えてくれません)。

JavaScriptでは、文字列の '生の'バイトを得る方法がありますか?またはLatin-1またはASCII文字コードを直接取得するか、文字エンコーディング間で変換するか、またはデフォルトのエンコーディングを定義していますか?

私は自分のマッピングを書くことができましたが、私はむしろそうしたくありません。私はそれが私がやっていくものだと思っていますが、それはkludgeのkludgeの感触を持っています。

私は呼び出し元のアプリケーションで調整できるものがあるかどうかを調べています(疑いはありますが、データをワイド文字列として渡すことができるため)。

いずれにせよ、私は単純なJavaScriptソリューションがあるのか​​、そうでないのかを理解することに興味があります。

(着信データが文字データだった場合、Unicodeはとても自動的に対処したことは素晴らしいこと。しかし、それはないだろう、それだけでバイナリデータストリームです。)

おかげで。

+0

Latin-1にDAGGER文字はありません。あなたはおそらくWindows-1252を意味します。 – dan04

答えて

6

文字列中の生のバイトのようなものはありません。 EcmaScript仕様では、文字列をUTF-16コードユニットのシーケンスとして定義しています。これは、これまでに遭遇した通訳者によって公開された最も細かい表現です。

ブラウザにはエンコードライブラリはありません。バイト配列を文字列として表現しようとしていて、それを再エンコードしたい場合は、独自にロールバックする必要があります。

文字列がすでに有効なASCIIである場合は、charCodeAtメソッドを使用してコード単位の数値を取得できます。

"\n".charCodeAt(0) === 10 
+0

"EcmaScript仕様では、文字列をUTF-16コードユニットのシーケンスとして定義しています"という断片に対して、この回答を受け入れています。私は当分の間ハッシュを書いた。私は後でより良い解決策を見つけるかもしれません。ありがとう。 – Rhubbarb

3

JavaScript(Ecmascript)の仕様で始まる:http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf。言う:

8.4文字列型 文字列型は、ゼロ以上の16ビット符号なし整数 値(「要素」)の全ての有限命じ シーケンスのセットです。文字列型は、実行中のECMAScript プログラム内のテキストデータを表すために一般的に です。この場合、文字列の各要素は、コード単位の値として扱われます(第6項参照)。各 要素は、 内の位置を占有しているとみなされます。これらの位置は、0以外の整数の で索引付けされます。最初の要素(ある場合)は、位置0の 、位置 の1の次の要素(存在する場合)などです。文字列の長さは、その中の要素数(すなわち、16ビット値)の です。 空の文字列の長さがゼロであるため、要素がない が含まれています。

文字列に実際のテキストデータが含まれている場合、各 要素は1つのUTF-16コード単位とみなされます。 これが 文字列の実際の格納形式であるかどうかにかかわらず、文字列内の文字には、 がUTF-16を使用して表されているように、 によって初期コード単位要素の位置が付けられます。文字列 (特に指定されている場合を除いて)のすべての操作は、 未分化16ビット符号なし整数のシーケンスとして扱います。 結果の文字列が正規化された形式であることを確認したり、 の文字列が確実に言語に依存する結果を出さないようにします。

注記このデザインの背後にある理論的根拠は、 の文字列の実装を可能な限りシンプルで高性能なものに保つことでした( )。実行中のプログラムが表示される前に 外部に実行環境(例えば、ユーザ入力、 テキストがファイルから読み込まれたり、ネットワーク経由で受信されたなど)に入ってくるテキストデータは、 Unicode正規化されたフォームCに変換されます。 。通常、これは同じ時刻に受信テキストが元の 文字エンコーディングからUnicodeに変換される(そして オーバーヘッドを追加しない)ときに、 で発生します。 ECMAScriptソース コードが正規化されたフォームCであることが推奨されるため、Unicode エスケープシーケンスが含まれていない限り、文字列リテラルは を正規化することが保証されます(ソーステキストが に正規化されることが保証されている場合)。)はあなたを与えるものcharCodeAt(P

は、文字列内のインデックスのpでの文字のUTF-16値(16ビット数)です。 UTF-16はUnicodeのBasic Multilingual Plane(コードポイントU+0000U+D7FFおよびU+E000U+FFFF)を直接表すので、Latin-1文字は、期待する値にする必要があります。

UTF-16への変換が完了し、インバウンドオクテットストリームのエンコーディングが間違っている場合は、受信第3オクテットストリーム—にエンコードの問題があることを示唆していません。奇妙な結果を得る。

実際にはUTF-8(またはその逆)の場合は、バニラASCIIとして扱われている可能性があります。 UTF-8は、0x7Fより上のコードポイントを2-、3-、または4-オクテットの「字体」として表します。

+0

情報ありがとうございます。しかし、エンコーディングに問題はありません。値はUnicode値として完全な意味を持ちます。値は分かりやすく翻訳されています。私はちょうどそれらが翻訳されるのを望まなかった。あなたの情報はすべて同じ役に立ちます。 – Rhubbarb

関連する問題