将字符串从 UTF-8 转换为 ANSI 并将其显示为 UTF-8



我想模仿Java一件事,我可以用Notepad++做。

TEXT_2 = convert(TEXT_1) // where: TEXT_2 = "Български", TEXT_1 = "БългарÑки"

如何使用记事本++做到这一点

设置起点...

打开Notepad++并单击:Encoding / Encode in UTF-8,然后粘贴TEXT_1

БългарÑки

获取TEXT_2

单击:Encoding / Convert to ANSI,然后单击:Encoding / Encode in UTF-8。做。

如何使用 Java 做到这一点

到目前为止,我有以下功能(部分工作(:

public static String convert(String text) {
String output = new String(Charset.forName("Cp1252").encode(text).array(), Charset.forName("UTF8"));
return output;
}
System.out.println(convert("БългарÑки"));

有了这个函数,我得到:

Българ�?ки // where correct is slightly different: Български

有什么想法可以让它工作吗?

如果可能,您能否提供可在函数convert()内工作的代码?谢谢。

在"Ð'ългарÑ_кÐ"中丢失了信息; 在"_"处应该有另一个字符,但 Cp1252 不会将任何字符映射到字节值0x81。该字节来自编码"с"到字节序列0xD1 0x81。

当您直接从源复制损坏的文本时,剪贴板数据中可能包含不可打印的控制代码(C1 代码"HOP",高八位字节预设(,并且 Notepad++ 获取完整的信息。但是,当复制到其他上下文(如Java IDE和此论坛(时,此控制字符可能会丢失。

原始数据需要解码为 UTF-8,而不是在 CP-1252 下错误地转换为文本,剥离控件,然后再次解码为 UTF-8。复制粘贴时,从哪里复制?为什么不使用 UTF-8 而不是 CP-1252 读取该文件?

以下是避免对每次转换执行字符集查找的解决方案:

import java.nio.charset.Charset;
private final Charset UTF8_CHARSET = Charset.forName("UTF-8");
String decodeUTF8(byte[] bytes) {
return new String(bytes, UTF8_CHARSET);
}
byte[] encodeUTF8(String string) {
return string.getBytes(UTF8_CHARSET);
}

第二种方法:

从字符串转换为字节[]:

String s = "some text here";
byte[] b = s.getBytes("UTF-8");

从 byte[] 转换为字符串:

byte[] b = {(byte) 99, (byte)97, (byte)116};
String s = new String(b, "US-ASCII");

当然,您应该使用正确的编码名称。我的例子使用了"US-ASCII"和"UTF-8",这是两种最常见的编码。

最新更新