2014-09-13 91 views
0

我遇到了一些麻烦,包含字符串像这样的文本文件: Grandchamp乐-CH \ 303 \ 242teau处理字符串与八进制的ASCII码(在Java中)

这是维基百科页面的名称顺便一提。两个asciis代表“我认为。

是否有任何软件,可以轻松地转换上面的字符串到 格朗德尚莱沙托 也许 Grandchamp乐-CH%C3%A2teau

我宁愿一个Java absed的解决方案,但是任何其他想法也一样! 任何建议或提示非常感谢!

回答

2

这是为了实现自己的目标稍微哈克的方式:

final String name = "Grandchamp-le-Ch\\303\\242teau"; 
final Matcher m = Pattern.compile("\\\\(\\d{3})").matcher(name); 
final StringBuffer out = new StringBuffer(); 
while (m.find()) m.appendReplacement(out, String.valueOf((char)parseInt(m.group(1), 8))); 
m.appendTail(out); 
final String decoded = new String(out.toString().getBytes(ISO_8859_1), UTF_8); 
System.out.println(decoded); 

工作原理:

  1. 正则表达式的八进制字符符号匹配;
  2. 通过用数字值等于该八进制数的字符替换每个这样的八进制符号来转换原始字符串;
  3. 新字符串(现在处于“mojibake”状态)被写为字节,使用单字节编码(任何都可以,但ISO_8859_1恰好是标准字符);
  4. 重新读取字节,现在假设它们是UTF-8编码的字符串。

的代码将打印出

Grandchamp-le-Château 
-1

给你:

String myString = "Grandchamp-le-Ch\303\242teau"; 
byte[] byteArray = myString.getBytes("ISO-8859-1"); 
String result = new String(byteArray, "UTF-8"); 
System.out.println(result); 

此打印:

Grandchamp-le-Château 
+0

你是依靠Java编译器来分析你的八进制字符。生成的字符串*不会包含八进制符号。尝试将你的字符串写入一个文件并阅读它。 – 2014-09-13 10:25:18

+0

这会打印出你想要的东西,因为Java编译器替你替换了。要试验OP的字符串,请在编译的程序中使用两个斜杠。 – dasblinkenlight 2014-09-13 10:25:22

相关问题