2016-12-02 1 views
1

Я пишу программу Java, которая сохраняет данные в текстовые файлы UTF8. Тем не менее, я также хотел бы предоставить вариант для сохранения в IBM437 для совместимости со старой программой, которая использует файлы файлов того же типа.Проверьте, могут ли данные быть представлены в указанной кодировке

Как проверить, не отображаются ли данные, которые пользователь пытается сохранить, в IBM437? В настоящий момент файл сохраняется без жалоб, но приводит к замене необычных символов вопросительными знаками.

Я бы предпочел, чтобы я мог показать пользователю предупреждение о том, что данные, которые они сохраняют, не поддерживаются в IBM437. Затем пользователь может иметь возможность вручную заменять символы ближайшим эквивалентом ASCII.

Текущий код для сбережений:

String encoding = "UTF-8"; 
if (forceLegacySupport) 
{ 
    // Force character encoding to IBM437 
    encoding = "IBM437"; 
} 

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(saveFile.getAbsoluteFile()), encoding)); 
IOController.writeFileToDisk(bw); 
bw.close(); 
+1

Какой код вы используете для сохранения данных? –

+1

Charset имеет метод getEncoder(), возвращающий CharsetEncoder. CharsetEncoder имеет метод canEncode (char), возвращающий логическое значение. Javadoc очень полезен. –

+0

Мои полные и глубокие извинения @ JBNizet для того, чтобы пропустить это в javadoc. – PeteBrew

ответ

0

Как отметил Б. Nizet в комментариях вы можете использовать кодировки кодера и для создания текста/строки в UTF-8 только предложение от моего конца:

public static char[] cookie = "HEADER_COOKIE".toCharArray(); 
byte[] cookieInBytes = new byte[COOKIE_SIZE]; 
for(int i=0;i<cookie.length;i++) 
     { 
      if(i < cookie.length) 
       cookieInBytes[i] = (byte)cookie[i]; 

     } 
String headerStr = new String(cookieInBytes,StandardCharsets.UTF_8); 
+0

'(byte) cookie [i]' - очень подозрительная конструкция. Весь алгоритм имеет мало смысла и, похоже, работает только в случае текста, содержащего только [C0 Controls и Basic Latin] (http://www.unicode.org/charts/nameslist/index.html), что не подразумевается на вопрос. –

+0

hi Tom, Я не так свободно владею кодировками, пожалуйста, позвольте мне и человеку, задающему вопросы, узнать лучшее обходное решение, чтобы оно поддерживало большинство текстов. это поможет мне в будущих заданиях точно. P.s. пожалуйста, не сосредотачивайтесь на алгоритме специально это было одним из решений для меня, когда я перемещал данные с Java-клиента на сервер на основе C для пустых байтов. –

+0

Стандартные библиотеки Java обрабатывают преобразование в собственную кодировку символов и из нее, UTF-16 (один из нескольких для набора символов Unicode). Вопрос относится к преобразованию в CP437, но поскольку Unicode имеет больше кодовых точек, чем CP437, преобразование по умолчанию заменяет заменяющий символ ('?'), Где нет совпадения. Вопрос, который задает вопрос, хочет знать, когда это произойдет. 'canEncode (charSequence)' делает это для графиков Unicode и 'canEncode (char)' делает это для кодовых блоков UTF-16 (предположительно вы использовали бы последний только для блока кода, который представляет полный код). –

Смежные вопросы