0

このためのJavadocは次のように述べています。

整数oneCharの下位2バイトのみが書き込まれます。

これは、intにキャストされた非utf8エンコード文字の書き込みにどのような影響を及ぼしますか?

アップデート:

問題のコードは、ソケットからデータを受け取り、それをファイルに書き込みます。(受信と書き込みの間に多くのことが起こるので、BufferedReader#readLine()を使用して取得した文字列を使用することはできません)。Writer#write(char [])を使用していましたが、これは毎回新しいchar配列を作成する必要があることを意味しました。毎回配列を作成することを回避するために、-1(charにキャスト)で満たされた単一のchar配列がありました。

次に、TextUtils#getCharsを使用してそれを埋め、必要に応じて配列を展開します。書き込みでは、配列をループし、char [i] ==(char)-1==trueになるまでWriterに書き込みます。

4

1 に答える 1

0

内部的に write(int)は、パラメータを にキャストするだけなcharので、write(i)と同等write((char)i)です。

現在、Java では、内部的charには 0 ~ 65535 (つまり 16 ビット) の範囲の単なる整数型です。キャスト int -> char は「縮小プリミティブ変換」( Java 言語仕様、5.1.3 ) でありint、符号付き整数であるため、次のようになります。

符号付き整数から整数型 T への縮小変換では、下位 n ビットを除くすべてのビットが単純に破棄されます。ここで、n は型 T を表すために使用されるビット数です。数値の大きさに関する情報が失われる可能性に加えて、 、これにより、結果の値の符号が入力値の符号と異なる場合があります。

そのため、Javadoc には下位 2 バイトのみが書き込まれると記載されています。

これが文字に関して何を意味するかは、int 値をどのように解釈するかによって異なります。Javaの Acharは、UTF-16 の Unicode コード ポイントを表します。つまり、char で表される 16 ビットの数値は、Unicode コード ポイントの数値として解釈されます。したがって、int 値のそれぞれが 16 ビット コード ポイントの数であれば問題ありません (実際、これは BMP 内の文字にのみ当てはまります。補助プレーン内の文字を使用すると、各 Unicode コード ポイントがエンコードされます。 2char秒に)。それ以外の場合 (16 ビットを超えるコード ポイント、負の数、またはまったく別のものを含む) は、ガベージになります。

int にキャストされた utf8 以外の文字を書き込む際に、これはどのような影響がありますか?

「非 utf8 char」などというものはありません。UTF-8 はencodingであり、Unicode コード ポイントを表す方法であるため、提起された質問は無意味です。多分あなたのコードが何をするか説明できますか?

于 2010-09-06T20:42:31.953 に答える