java将utf-8 2字节字符转换为1字节字符

时间:2014-10-27 13:37:26

标签: java encoding utf-8

有许多类似的问题,但没有人帮助过我。

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

2 个答案:

答案 0 :(得分:2)

首先:没有" 1字节字符"或者,事实上," n byte char"无论如何。

在Java中,char是UTF-16代码单元;根据(Unicode)代码点,表示代码点需要一个或两个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代替PrintStreamWriter并发送字节数组,或者可以执行以下操作:< / p>

new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "cp863"))