我想模仿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",这是两种最常见的编码。