2014-12-04 3 views
1

я не могу узнать, как сделать преобразование нижеПреобразования между кодировкой символов в Java

String s = "Här har du! â\u0080\u0093 Hur väl kan du snacka?"; 
t = convert(s); 
// t should be "Här har du! â Hur väl kan du snacka?" 

Я не могу найти, как перевести S в т. Кто-нибудь знает, как это сделать на Java?

+1

Использования UTF-8. Серьезно: почему кто-то * не использует unicode в наши дни? – DaoWen

+0

Это странно. Символы 'Ã'', очевидно, являются байтами UTF-8, принужденными к символам, но' â' является правильным, и я не знаю, что такое '' u0080 \ u0093', поскольку они не являются допустимыми UTF-8 байтовую последовательность, и они даже не имели бы смысла в кодировке windows-1252. Таким образом, эта строка, похоже, не выводится из любой кодировки. – VGR

+0

Вы правы, что строка выглядит очень странно ... – errantlinguist

ответ

2

Попробуйте sthg;

 String s = "Här har du! â\u0080\u0093 Hur väl kan du snacka?";   
    byte[] bytes = s.getBytes("ISO-8859-1"); 
    String str = new String(bytes, "UTF-8"); 

Выход есть;

Här har du! – Hur väl kan du snacka? 

Для нижнего кода;

public static void main (String[] args) throws java.lang.Exception 
{ 
    String s = "Här har du! â\u0080\u0093 Hur väl kan du snacka?";   
    byte[] bytes = s.getBytes("ISO-8859-1"); 
    String str = new String(bytes, "UTF-8"); 
    System.out.println(str); 
} 
+1

Ваши первые две строки кода преобразуют строку в байты с использованием UTF-8, а затем обратно в строку, используя UTF-8, что означает, что они бесполезны и могут быть удалены. Ваша последняя строка, 'new String (latin1)', будет использовать кодировку по умолчанию вашей платформы, что является очень плохой идеей. Для вас это случилось *, но это вряд ли надежно. – VGR

+0

Я тестировал и вставляю здесь. Вы пишете, я редактировал свой ответ. –

+0

Это выглядит правильно, хотя лучше использовать StandardCharsets.ISO_8859_1 и StandardCharsets.UTF_8 вместо строковых литералов, так как строки имеют опечатки и потому что использование стандартных кодировок устраняет необходимость в сборе исключения. – VGR

0

Как я уже упоминал в своем комментарии, это выглядит как ваша строка s является уже испорчены. правильное решение - исправить, где бы вы ни находились s. кажется, что вы интерпретируете то, что на самом деле является кодированной строкой «UTF-8», использующей кодировку с одним байтом («ISO8859-1», похоже, работает с вашей тестовой строкой).

условия, что вы уже не имеете потеряло данных в исходной строке коррупции, вы можете несколько исправить текущую строку с помощью:

String s = "Här har du! â\u0080\u0093 Hur väl kan du snacka?";   
    byte[] b = s.getBytes("ISO-8859-1"); 
    String t = new String(b, "UTF-8"); 
Смежные вопросы