String s=(char)0xff;
0xff - это русская буква "я". После компилирования в классе (если его тупо открыть в блокноте) можно будет найти эту букву "я" в кодировке unicode в виде двух байт (каких именно не помню, лень рассчитывать), для наглядности можно написать целый текст, примерно, так:
String s=(char)0xff+(char)0xda+(char)0xe1+(char)0x98+(char)0xfa+(char)0xa3+(char)0xa1+(char)0xf0;
То есть ещё на этапе компиляции все явно заданные строки конвертируются в unicode. Я хз, может я последний человек на земле, который всего этого не знал =) Но тему не для этого создал. Я поставил перед собой задачу написать функцию, которая сможет считывать файлы в utf-8. Сложностей оказалось две:
1) Utf-8 - мультибайтная кодировка текста, каждый символ которой кодируется последовательностью от 1 до 6 байт (в реальности используются только 1-4 байта, так как их хватает за глаза). А текст считывается из файла побайтно, а не посимвольно, что логично. Следовательно каждый символ надо при считывании собирать из последовательности байт, длину которой тоже надо на лету рассчитывать, а только потом конкатенировать к строке.
2) Собственно там же, на лету, надо ещё превести каждый символ к кодировке unicode.
Ну так вот. Заюзав это: http://ru.wikipedia.org/wiki/UTF-8 , написал функцию =)
Код: Выделить всё
public static String read(String r){
try{
InputStream i=M.T.getClass().getResourceAsStream(r);
StringBuffer s;
s=new StringBuffer();
int b1,b2,b3,b4;;
while((b1=i.read())!=-1){
if(b1<0x80){
s.append((char)b1);
}else if(b1>0xEF&&b1<0xF8){
b2=i.read(); b3=i.read(); b4=i.read();
s.append((char)((b1-0xf0)*0x40000+(b2-0x80)*0x1000+(b3-0x80)*0x40+b4-0x80));
}else if(b1>0xDF){
b2=i.read(); b3=i.read();
s.append((char)((b1-0xE0)*0x1000+(b2-0x80)*0x40+b3-0x80));
}else if(b1>0xbF){
b2=i.read();
s.append((char)((b1-0xC0)*0x40+b2-0x80));
}else{
s=null;
break;
}
}
i.close();
return s.toString();
}catch(Exception ex){
return "";
}
}
- - -
P.S: M - это класс мидлет паскаля, я в виде либы для него писал. Через него обратился к getResourceAsStream().