这里的大多数答案都提出了捷径,如果您不知道自己在做什么,这可能会给您带来大问题。如果你想走捷径,那么你必须确切地知道你的数据是用什么编码的。
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 位字符。
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、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);
您还可以使用InputStreamReader,它可以使用字符集参数进行实例化。
还有一条黄金法则:永远不要直接将字节转换为字符。这总是一个错误。