Converting stream of int's to char's in java

This has probably been answered else where but how do you get the character value of an int value?

Specifically I'm reading a from a tcp stream and the readers .read() method returns an int.

How do I get a char from this?

369220 次浏览

简单的选角:

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

你有什么理由不喜欢这样吗?

如果试图将流转换为文本,则需要知道要使用哪种编码。然后,您可以将一个字节数组传递给 String构造函数并提供一个 Charset,或者将 InputStreamReader与适当的 Charset一起使用。

只有在您想要 ISO-8859-1的情况下(如果您直接从流中读取字节) ,才能简单地从 int转换为 char

编辑: 如果你的 已经使用了 Reader,那么将 read()的返回值转换为 char是正确的方法(在检查它是否为 -1之后) ... ... 但是通常调用 read(char[], int, int)来一次读取整个文本块会更有效和方便。但是不要忘记检查返回值,看看读取了多少个字符。

也许你想要的是:

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

更多信息: Character.toChars(int codePoint)

将指定的字符(Unicode字符)转换为存储在 char 数组中的 UTF-16表示形式。如果指定的代码点是 BMP (基本多语言平面或平面0)值,则生成的字符数组具有与 codePoint 相同的值。如果指定的代码点是补充代码点,则生成的字符数组具有相应的代理项对。

这完全取决于传入数据的编码。

这取决于您所说的“将 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);
....
}

如果只想简单地将 int 5转换为 char’5’: (Only for integers 0 - 9)

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

将 char 转换为 int 或 long 的解决方案是简单的强制转换。

例如:-如果您想将 Char’0’转换为 long。

跟随简单的投掷

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

搞定!

也许不是最快的:

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

此解决方案适用于整数长度大小 = 1的情况。

整数输入 = 9; Character.valueOf((char) input.toString().charAt(0))

如果 size > 1,我们需要使用 for 循环并迭代遍历。

这里的大多数答案都提供了一些捷径,如果你不知道自己在做什么,这些捷径可能会给你带来大问题。如果您想走捷径,那么您必须准确地知道数据的编码方式。

UTF-16

Whenever java talks about characters in its documentation, it talks about 16-bit characters.

您可以使用 DataInputStream,它有方便的方法。为了提高效率,将它包装在 BufferedReader中。

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

问题是,每个 readChar()实际上将执行2个 read,并将它们组合成一个16位字符。

US-ASCII

US-ASCII 保留8位编码1个字符。但是 ASCII 表只描述了128个可能的字符,所以1位总是未使用。

在这种情况下,您可以简单地执行强制转换。

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

扩展 ASCII

UTF-8、拉丁文 -1、 ANSI 和许多其他编码都使用8位。第一个7位紧跟在 ASCII 表之后,与 US-ASCII 编码的表相同。但是,第8位提供的字符在所有这些编码中都是不同的。事情变得有趣了。

If you are a cowboy, and you think that the 8th bit does not matter (i.e. you don't care about characters like "à, é, ç, è, ô ...) then you can get away with a simple cast.

但是,如果您想要专业地进行这项工作,那么在导入/导出文本(例如套接字、文件... ...)时,您应该始终指定一个字符集。

永远使用字符集

我们认真点。以上所有的选择都是廉价的伎俩。如果你想编写灵活的软件,你需要支持一个可配置的字符集来导入/导出你的数据。这里有一个通用的解决方案:

使用 byte[]缓冲区读取数据并将其转换为 String 使用字符集参数

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

您还可以使用 InputStreamReader,它可以用一个字符集参数实例化。

还有一条金科玉律: 永远不要直接对字符进行字节转换,这永远是错误的。

例如,我的答案是基于这样的假设: 用户只是想直接将 int转换为 char

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

这个问题上面已经回答过了,但是如果是整数值 i > 10,那么就需要使用 char array

char[] c = String.valueOf(i).toCharArray();
    int i = 7;
char number = Integer.toString(i).charAt(0);
System.out.println(number);