Проблемы с русским

Модератор: Absurd

Ответить
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

12 апр 2004, 14:27

Нужен класс, переводящий русские буквы в транслит. Я попробовал сделать - не выходит... проблема такая: в конструкторе создаю HashMap, закидываю такие пары:

chars.put("Ш", "SH");

далее в методе посимвольно перевожу в транслит.
public String toTranslit(String line) {
StringBuffer res = new StringBuffer();
for (int i=0; i<line.length(); i++) {
try {
String ch = new String(line.substring(i, i+1));
System.out.println(ch);
if (chars.get(ch)!=null) {
res.append((String)chars.get(ch));
} else {
res.append(ch);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
return res.toString();
}


потом читаю текст из файла в кодировке Cp1251. Результаты вывожу в новый файл:
public static void main(String[] args) {
Convertor c = new Convertor();
try {
BufferedReader fin = new BufferedReader(new InputStreamReader(new FileInputStream("in.txt"), "Cp1251"));
String l = fin.readLine();
fin.close();
System.out.println(l);
PrintWriter fout = new PrintWriter(new FileWriter("out.txt"));
fout.println(l);
fout.println(c.toTranslit(l));
fout.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
В итоге в out.txt появляется мое слово русскими буквами 2 раза.

Думаю проблема в том, что в байт-кодах русские буквы из Hashtable сохранены неправильно, то есть не с теми кодами. Пробовал исходный файл сохранять в Cp1251 - все равно не катит. Что делать? Может у кого есть готовый класс?
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

12 апр 2004, 14:39

Как я понял, у тебя не прокатывает chars.get(ch)!=null. А ты уверен, что у тебя HashMap не пустой?
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

12 апр 2004, 14:42

А, блин, Семён Семёныч! Ты в HashMap складываешь char'ы, а извлечь пытаешься строки. Нифига у тебя не выйдет так.
Даже самый дурацкий замысел можно воплотить мастерски
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

12 апр 2004, 14:47

ок, делаем так:
public void Convertor() {
chars.put(new String("А"), new String("A"));
chars.put(new String("Б"), new String("B"));
chars.put(new String("В"), new String("V"));
chars.put(new String("Г"), new String("G"));
chars.put(new String("Д"), new String("D"));
chars.put(new String("Е"), new String("E"));
chars.put(new String("Ё"), new String("YO"));
chars.put(new String("Ж"), new String("ZH"));

результат тот же
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

12 апр 2004, 14:50

ух ты, добавил
public String toTranslit(String line) {
StringBuffer res = new StringBuffer();
if (chars.isEmpty()) {
return null;
}
for (int i=0; i<line.length(); i++) {

и получил null. Hashmap и правда пустой... интересно, почему?
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

12 апр 2004, 14:52

все, понял, я конструктор описал public void, а надо просто public
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

12 апр 2004, 15:04

Кстати, я наврал во втором сообщении. Стравнение нормально проходит.
Даже самый дурацкий замысел можно воплотить мастерски
Ответить