2015-07-02 2 views
1

У меня есть строка, которая используется, чтобы быть XML-тег, где mojibakes содержатся:
<Applicant_Place_Born>Ð&#156;оÑ&#129;ква</Applicant_Place_Born>Java преобразовать кодирующий

Я знаю, что точно такая же строка, но в правильной кодировке является:
<Applicant_Place_Born>Москва</Applicant_Place_Born>

I знайте это, потому что, используя утилиту Tcl, я могу преобразовать ее в правильную строку:

# The original string 
set s "Ð&#156;оÑ&#129;ква" 
# substituting the html escapes 
set t "Ð\x9cоÑ\x81ква" 
# decode from utf-8 into Unicode 
encoding convertfrom utf-8 "Ð\x9cоÑ\x81ква" 
Москва 

Я пробовал различные варианты:

System.out.println(new String(original.getBytes("UTF-8"), "CP1251")); 

но у меня всегда были другие мохибэки или вопросительные знаки вместо символов.

В: Как я могу сделать то же, что и Tcl, но используя код Java?

EDIT:

Я попытался подход @Joop Эгген в:

import org.apache.commons.lang3.StringEscapeUtils; 


public class s { 
    static String s; 
    public static void main(String[] args) { 
     try { 
      System.setProperty("file.encoding", "CP1251"); 
      System.out.println("JVM encoding: " + System.getProperty("file.encoding")); 
      s = "Ð&#156;оÑ&#129;ква"; 
      System.out.println("Original text: " + s); 

      s = StringEscapeUtils.unescapeHtml4(s); 
      byte[] b = s.getBytes(StandardCharsets.ISO_8859_1); 
      s = new String(b, "UTF-16BE"); 

      System.out.println("Result: " + s); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

Конвертируемая строка была что-то Chineese:

JVM encoding: CP1251 Original text: Ð&#156;оÑ&#129;ква Result: 킜킾톁킺킲킰

ответ

2

Строка в java всегда должна быть правильной Unicode. В вашем случае, похоже, UTF16BE интерпретируется как однобайтовая кодировка.

патч будет

String string = new StringEscapeUtils().UnescapeHTML4(s); 
byte[] b = string.getBytes(StandardCharsets.ISO_8859_1); 
string = new String(b, "UTF-16BE"); 

Теперь s должен быть правильным Unicode строк.

System.out.println(s); 

Если операционная система, например, находится в Cp1251, текст кириллицы должен быть преобразован правильно.

  • В символы являются фактически байт UTF-16BE Я думаю
  • Получая байты строки в кодировке однобайтной надеюсь, никакого преобразования не происходит
  • Затем сделайте строку байтов, как в UTF-16BE, внутренне преобразуется в Unicode (на самом деле UTF-16BE тоже)
+1

Вы сбросили ')' на третьей строчке :) – jkeuhlen

+0

@jkeuhlen спасибо, мой ответ до сих пор является весьма неопределенным, как строки содержимое перепутано. Возможно, ваш ответ помогает лучше. –

+1

@JoopEggen Я изменил 'string = new String (b," UTF-16BE ");' to 'string = new String (b," UTF-8 ");' и это сработало. Спасибо. – griboedov

1

Вы были очень близки. Однако getBytes используется для кодирования UTF-8 вместо декодирования. Вы хотите что-то вроде строк

String string = "Ð\x9cоÑ\x81ква"; 
byte[] bytes = string.getBytes("UTF-8"); 
System.out.println(new String(bytes, "UTF-8")); 
Смежные вопросы