web-dev-qa-db-ja.com

javaでintのストリームをcharに変換しています

これはおそらく他の場所で回答されていますが、int値の文字値をどのように取得しますか?

具体的には、tcpストリームからaを読み取り、リーダーの.read()メソッドはintを返します。

これから文字を取得するにはどうすればよいですか?

114
Omar Kooheji

ストリームをテキストに変換しようとしている場合は、使用するエンコーディングを認識する必要があります。次に、バイト配列を String コンストラクターに渡して Charset を指定するか、代わりに適切なInputStreamReaderCharset を使用します。

intからcharへの単純なキャストは、ストリームからバイトを直接読み取る場合、ISO-8859-1が必要な場合にのみ機能します。

編集:areがすでにReaderを使用している場合、read()の戻り値をcharにキャストするのが正しい方法です(-1かどうかを確認した後)またはない)...しかし、通常は一度にread(char[], int, int)を呼び出してテキストブロック全体を読み取る方が効率的で便利です。ただし、戻り値をチェックして、読み取られた文字数を確認することを忘れないでください。

74
Jon Skeet

たぶんあなたが求めている:

Character.toChars(65) // returns ['A']

詳細: Character.toChars(int codePoint)

指定された文字(Unicodeコードポイント)を、char配列に格納されているUTF-16表現に変換します。指定されたコードポイントがBMP(Basic Multilingual PlaneまたはPlane 0)値の場合、結果のchar配列はcodePointと同じ値になります。指定されたコードポイントが補助コードポイントである場合、結果のchar配列には対応するサロゲートペアが含まれます。

144
ATorras

「intをcharに変換する」という意味に依存します。

単にintに値をキャストしたい場合は、Javaの型キャスト表記を使用してキャストできます。

int i = 97; // 97 is 'a' in ASCII
char c = (char) i; // c is now 'a'

整数1を文字「1」に変換することを意味する場合、次のようにできます。

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}
105
Lovubuntu

Int 5をchar '5'に単純に変換する場合:(整数0〜9のみ)

int i = 5;
char c = (char) ('0' + i); // c is now '5';
29
Ryan Anderson

単純なキャスト:

int a = 99;
char c = (char) a;

これが機能しない理由はありますか?

8
Yuval Adam

このソリューションは、整数の長さのサイズ= 1で機能します。

Integer input = 9; Character.valueOf((char) input.toString().charAt(0))

サイズが1より大きい場合、forループを使用して繰り返し処理する必要があります。

4
Spiker

ここでのほとんどの回答はショートカットを提案します。これは、何をしているかわからない場合に大きな問題を引き起こす可能性があります。ショートカットを使用する場合は、データのエンコードが正確に何であるかを知る必要があります。

UTF-16

Javaがドキュメントで文字について話すときはいつでも、16ビット文字について話します。

便利なメソッドがあるDataInputStreamを使用できます。効率のために、BufferedReaderでラップします。

// e.g. for sockets
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
char character = readChar(); // no need to cast

問題は、各readChar()が実際に2つのreadを実行し、それらを1つの16ビット文字に結合することです。

US-ASCII

US-ASCIIは、1文字をエンコードするために8ビットを予約しています。ただし、ASCIIテーブルは128の可能な文字のみを記述するため、1ビットは常に使用されません。

この場合、単にキャストを実行できます。

int input = stream.read();
if (input < 0) throw new EOFException();
char character = (char) input;

拡張ASCII

UTF-8、Latin-1、ANSIおよび他の多くのエンコーディングは、すべて8ビットを使用します。最初の7ビットはASCIIテーブルに続き、US-ASCIIエンコーディングのものと同じです。ただし、8ビット目では、これらすべてのエンコーディングで異なる文字が提供されます。したがって、ここで興味深いことが起こります。

あなたがカウボーイであり、8ビット目が重要でないと思う場合(つまり、 "à、é、ç、è、ô...のような文字を気にしない場合)、あなたは逃げることができます単純なキャスト。

ただし、これを専門的に行いたい場合は、テキスト(たとえば、ソケット、ファイルなど)をインポート/エクスポートするたびに、常に文字セットを指定する必要があります。

常に文字セットを使用する

真剣になりましょう。上記のオプションはすべて安価なトリックです。柔軟なソフトウェアを作成する場合は、設定可能な文字セットをサポートしてデータをインポート/エクスポートする必要があります。一般的なソリューションは次のとおりです。

byte[]バッファーを使用してデータを読み取り、それをStringに変換しますcharsetパラメーターを使用

byte[] buffer = new byte[1024];
int nrOfBytes = stream.read(buffer);
String result = new String(buffer, nrOfBytes, charset);

また、charsetパラメーターでインスタンス化できるInputStreamReaderを使用することもできます。

もう1つの黄金律:バイトを文字に直接キャストしないでください。それは常に間違いです。

1
bvdb
    int i = 7;
    char number = Integer.toString(i).charAt(0);
    System.out.println(number);
1
Shwarz Andrei

たとえば、ユーザーがintcharにリテラルに変換したいという仮定に基づいて私の答えを基にしています

Input: 
int i = 5; 
Output:
char c = '5'

これは既に上記で回答されていますが、整数値i > 10の場合、char arrayを使用する必要があります。

char[] c = String.valueOf(i).toCharArray();
1
src3369

これは、着信データのエンコードに完全に依存しています。

0
carej

おそらく最速のものではありません:

//for example there is an integer with the value of 5:
int i = 5;

//getting the char '5' out of it:
char c = String.format("%s",i).charAt(0); 
0
Guest89898989