在Java中将int的流转换为char的


114

可能在其他地方已经回答了这个问题,但是如何获得int值的字符值呢?

具体来说,我正在从tcp流中读取a,而readers .read()方法返回一个int值。

我如何从中获取一个字符?


1
您没有详细说明要发送和读取的数据。您发送二进制字节还是Unicode字符?读者.read()方法返回一个int值。是的,但是它返回读取的字符,范围为​​0到65535之间的整数(或-1,这是因为我认为用int代替了char)。也许只需使用public int read(char[] cbuf)就能解决问题?
万那

该问题的答案不适用于JSP Java。如果你正在使用JSP的,看到这个堆栈溢出漏洞:stackoverflow.com/questions/4621836/...
NuclearPeon

我认为这是一个有效的问题。一个从一个整数转换为字符,困难是处理负值和值> = 255。
bvdb

如果我想将字节数组中的字节转换为字符,然后将其打印到控制台怎么办?
Doug Hauf 2014年

Answers:


74

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

如果要直接从流中读取字节,则仅当需要ISO-8859-1时,才简单地从from转换intchar

编辑:如果您已经使用了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 。
万那

3
如果他真正使用Reader,那肯定会有所作为。目前尚不清楚,因为他在同一个句子关于流和读者(以小写r)的会谈:(已经编辑我的回答表明这一点。
乔恩斯基特

你也可以包装InputStreamReaderBufferedReader,如同在Javadoc中提到docs.oracle.com/javase/8/docs/api/java/io/...
bvdb

为什么“仅当需要ISO-8859-1时才从int强制转换为char”有效?是因为Java在内部使用UTF-16,并且所有ISO-8859-1字符在UTF-16中都保持相同的代码单位(位)?
塞巴斯蒂安2015年

@Sebastien:是的,基本上就是这样。
乔恩·斯基特

144

也许您要的是:

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

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

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


9
仅当所讨论的整数已经是UTF-16代码点时才有效。我们不知道是不是这种情况。
乔恩·斯基特

2
@Atec:不,我的意思是,如果他只是从流中读取字节(尚不清楚),则仅通过强制转换或使用进行转换toChars通常是不合适的。如果他正在从Reader阅读,那很好。
乔恩·斯基特

2
尽管该问题没有具体说明,但该问题是Google搜索中将ASCII码点转换为字符的第一个结果,因此我对此表示赞同。
ArtOfWarfare 2012年

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年

这个答案是一个:-)
voghDev 2015年

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

+1-经过尝试和测试,有效!尝试自己测试一下,似乎不像这里的评论者...
Ian Campbell

8

简单转换:

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

有什么理由对您不起作用吗?


1
危险的建议,如果文本流不是纯ASCII。请参阅上方的乔恩·斯基特(Jon Skeet)的答案。
sleske,2009年

1
它可能不起作用。但我认为实际上是这样。char数据类型存储UTF-16编码值。因此,要将char转换为int,您需要进行一些转换。但是由于OP使用已经返回UTF-16编码值的read()方法,因此我认为可以进行简单的转换。如果我错了,请纠正我。
Vanuan

抱歉,我的意思是“从int到char”
Vanuan

这将导致意外的编码值,而不是数字
Vasil Valchev 2014年

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并将其组合为一个16位字符。

美国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,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);

您还可以使用InputStreamReader可以通过charset参数实例化的。

还有一条黄金法则:永远不要直接将一个字节转换为字符。那总是一个错误。


1

例如,我的假设是假设用户只是想将a转换intchar

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

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

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


0

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


这是无用的“答案”,我投了反对票,但这甚至不值得。
Lpc_dark

@Lpc_dark这个答案比其他答案的90%更正确。请参阅我的答案以获取更多详细信息。
bvdb

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

做完了!


那与他要的完全相反。
specializt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.