有许多类似的问题,但没有人帮助过我。
utf-8可以是1个字节或2,3,4。
ISO-8859-15总共2个字节。
但我需要1个字节的字符,如代码页代码“page 863”(IBM863)。
http://en.wikipedia.org/wiki/Code_page_863
例如,“é”是代码点233,在utf 8中长度为2个字节,如何在Java中将其转换为IBM863(1个字节)?
在JVM上运行-Dfile.encoding = UTF-8可能吗?
当然,转换意味着某些字符可能会丢失,因为IBM863更小。 但我需要语言特定的字符,如法语,è,é等。
EDIT1:
String text = "text with é";
Socket socket = getPrinterSocket( printer);
BufferedWriter bwOut = getPrinterWriter(printer,socket);
...
bwOut.write("PRTXT \"" + text + "\n");
...
if (socket != null)
{
bwOut.close();
socket.close();
}
else
{
bwOut.flush();
}
它带有指纹8.2的标签打印机。
编辑2:
private BufferedWriter getPrinterWriter(PrinterLocal printer, Socket socket)
throws IOException
{
return new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
}
答案 0 :(得分:2)
首先:没有" 1字节字符"或者,事实上," n byte char"无论如何。
在Java中,char
是UTF-16代码单元;根据(Unicode)代码点,表示代码点需要一个或两个char
。
您可以使用以下方法:
Character.toChars()
将Unicode代码点转换为代表此代码点的char
数组; CharsetEncoder
执行char[]
到byte[]
转换; CharsetDecoder
执行byte[]
到char[]
转化。您可以使用Charset
.new{Encoder,Decoder}()
方法获取后者。
了解输入的确切含义至关重要:它是一个代码点,它是一个编码的字节数组吗?您必须根据此情况调整代码。
最后注意事项:file.encoding
设置定义了在您未指定要使用的字符集时使用的默认字符集,例如在FileReader
构造函数中;你应该避免在开始时不指定字符集!
答案 1 :(得分:1)
byte[] someUtf8Bytes = ...
String decoded = new String(someUtf8Bytes, StandardCharsets.UTF8);
byte[] someIso15Bytes = decoded.getBytes("ISO-8859-15");
byte[] someCp863Bytes = decoded.getBytes("cp863");
如果您以字符串开头,请使用getBytes
并使用正确的编码。
如果要将具有适当编码的字符串写入套接字,可以使用OutputStream
代替PrintStream
或Writer
并发送字节数组,或者可以执行以下操作:< / p>
new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "cp863"))