Показать сообщение отдельно
Старый 16.12.2014, 10:59   #4
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Смесь: Неочевидное + Оптимизация

Загрузка текста из файла

Джава хорошо дружит с кодировкой UTF-8.
В ней на один символ приходится от 1 до 2 байтов.

Когда-то давно я пробовал загрузить текст из файла, и возникли проблемы.
В итоге я извратился, сделав свой формат строки, в котором символ представлен по типу джавовского:
size|byte1[byte2]

Так и жил с этим.
А недавно, делая проект на андроид, и пытаясь там грузить УТФ-текст из файла, я обнаружил, что в начале строки вылазит какой-то непонятный символ, но остальная часть строки нормальная.
Сделал самое простое: t = t.substring(1)
Но так как этот символ есть не всегда, то пришлось в начало добавлять спец. символ, типа #, и далее
i = t.indexOf('#');
t = t.substring(i);

Как-то это стрёмно, вставлять символ, выцеплять подстроку.

А потом обнаружил в Notepad++ кодировку "UTF-8 without BOM", решил сохранить в неё, и вуаля - всё чётко, только мой текст!

Ещё:

* в Qt строки в utf-8 сохраняются без BOM.
* в php чтение из файла - тоже лучше использовать без BOM, иначе левый символ в начале
* ответ на стековерфлоу: What's different between utf-8 and utf-8 without BOM?

Даёшь хранение текста в формате "UTF-8 without BOM"!

Моя функция загрузки текста:

public static String loadText(final String path) {
    try {
        final 
InputStream is Utils.class.getResourceAsStream(path);
        final 
DataInputStream dis = new DataInputStream(is);
        
int size dis.available();
        
byte b[] = new byte[size];
        
int actual dis.read(b);
        
dis.close();
        
is.close();
        
String s = (new String(b0actual"UTF-8")).trim();
        return 
s;
    }
    catch(
Exception e) {}
    return 
null;

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
Randomize (16.12.2014), St_AnGer (16.12.2014)