Javaでintのストリームをcharのストリームに変換する


114

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

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

これからイワナを取得するにはどうすればよいですか?


1
送信および読み取りするデータについて詳しく説明していません。バイナリバイトまたはUnicode文字を送信しますか?readers .read()メソッドはintを返します。はい。ただし、読み取った文字を0から65535の範囲の整数として返します(または-1です。これは、charの代わりにintを使用しているためです)。たぶん使用public int read(char[] cbuf)するだけで問題が解決するでしょうか?
バヌアン2009年

この質問に対する回答は、JSP Javaでは機能しません。あなたは、JSPのを使用している場合は、このスタックオーバーフローのバグを参照してください。stackoverflow.com/questions/4621836/...
NuclearPeon

これは妥当な質問だと思います。チャーの整数変換の難しさの一つは、負の値および値> = 255を扱っている
bvdb

バイト配列にあるバイトを文字に変換してコンソールに出力したい場合はどうすればよいですか?
Doug

回答:


74

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

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

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


2
これはOPが求めていることではないと思います。彼はReaderのreadメソッドを使用しています:java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read()彼が尋ねている質問は、このメソッドによって返された値をcharに変換する方法です。
バヌアン2009年

3
彼が本当にReaderを使っているなら、それは確かに違いを生む。それは彼が同じ文でストリームと(小文字のrの)リーダーを語ることを考えると、はっきりしていない:(持っているが、これは明確にするために私の答えを編集した。
ジョンスキート

あなたもラップすることができますInputStreamReaderBufferedReaderのJavadocで述べたように、docs.oracle.com/javase/8/docs/api/java/io/...
bvdb

なぜ「intからcharへの単純なキャストは、ISO-8859-1が必要な場合にのみ機能する」のですか?それは、Javaが内部でUTF-16を使用していて、すべてのISO-8859-1文字がUTF-16で同じコード単位(ビット)を保持しているためですか?
セバスチャン2015年

@セバスチャン:はい、基本的にはそれだけです。
Jon Skeet

144

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

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

より詳しい情報: Character.toChars(int codePoint)

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


9
これは、問題の整数がすでにUTF-16コードポイントである場合にのみ有効です。それが事実であるかどうかはわかりません。
ジョンスキート、

2
@Atec:いいえ、私のポイントは、ストリームからバイトを読み取っているだけの場合(明確ではありません)、キャストまたは使用するだけで変換することtoCharsは通常不適切であるということです。彼がリーダーから読んでいる場合は、問題ありません。
ジョンスキート、

2
確かに質問ではそれを指定していませんでしたが、この質問は、ASCIIコードポイントを文字に変換するGoogle検索の最初の結果として出てきたので、私はそれを賛成しています。
ArtOfWarfare

105

「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);
....
}

CharからIntegerに変更した場合はどうなりますか?Integer.parseInt(c)?
ブリードリー2013

この答えは1つです:-)
voghDev

29

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

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

いいえ。「0」+ 5は文字列「05」になります。右側は(char)((int) '0')+ iである必要があります。
toddkaufmann 2013年

Javaでは文字が文字列に変換されないため、真実ではありません。
Kaushik Shankar 2013

+1-試してテストしましたが、うまくいきます!試してみて、ここのコメンターとは一見違っているように見えます...
イアンキャンベル

8

簡単なキャスト:

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

これがうまくいかない理由はありますか?


1
テキストストリームが純粋なASCIIでない場合の危険なアドバイス。上記のJon Skeetの回答を参照してください。
sleske 2009年

1
動かないかもしれません。しかし、実際にはそうなると思います。charデータ型は、UTF-16コード化値を格納します。したがって、charをintにキャストするには、いくつかの変換を行う必要があります。しかし、OPは既にUTF-16でコード化された値を返すread()メソッドを使用しているので、単純なキャストが機能すると思います。私が間違っていたら訂正してください。
バヌアン2009年

申し訳ありませんが、私は「intからcharへ」を意味していました
バヌアン2009年

これにより、数値ではなく予期しないエンコード値が発生します
Vasil Valchev '10

4

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

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

サイズ> 1の場合、forループを使用して反復する必要があります。


1

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

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 文字セットパラメータを使用してに変換します

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

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

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


1

ユーザーはちょうどliteraaly変換したかったことを前提に私の答えを基づかintchar、たとえば、

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

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

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


0

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


これは役に立たない "答え"のようなものです。私は反対票を投じますが、それだけの価値はありません。
Lpc_dark 14

@Lpc_darkこの回答は、他の回答の90%よりも正確です。詳細については、私の回答を参照してください。
bvdb 2015

0

多分最速ではない:

//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); 

-2

charをintまたはlongに変換する答えは、単純なキャストです。

例:-Char '0'をlongに変換する場合。

シンプルキャストをフォローする

Char ch='0';
String convertedChar= Character.toString(ch);  //Convert Char to String.
Long finalLongValue=Long.parseLong(convertedChar);

できました!


それはまさに彼が求めていたものの正反対です。
specializ 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.