куди ж вона дійсно найчастіше дівається. :-) p> Ось типова програма а-ля HelloWorld:
public class Test
{
public static void main (String [] args)
{
System.out.println ("ЙЦУКЕНГШЩЗХ'");
}
}
в Far-е зберігаємо даний код у файл Test.java, компіляем ... p> C:> javac Test.java
і запускаємо ... p> C:> java Test
ЙЦУКЕНГ? ЩЗХ'
Що ж сталося? Куди поділася буква Ш? Весь фокус тут у тому, що сталася взаємокомпенсації двох помилок. Текстовий редактор в Far за замовчуванням створює файл в DOS-кодуванні (Cp866). Компілятор ж javac для читання исходника використовує file.encoding (якщо не вказано інше ключиком-encoding). А в середовищі Windows з російськими регіональними настройками кодуванням за замовчуванням є Cp1251. Це перша помилка. У результаті, в скомпільованому файлі Test.class символи мають невірні коду. Друга помилка полягає в тому, що для виведення використовується стандартний PrintStream, який теж використовує настройку з file.encoding, однак консольне вікно в Windows відображає символи, використовуючи кодування DOS. Якби кодування Cp1251 була взаімоодназначной, то втрати даних б не було. Але символ Ш в Cp866 має код 152, який у Cp1251 НЕ визначений, і тому відображається на Unicode-символ 0xFFFD. Коли відбувається зворотне перетворення з char в byte, замість нього підставляється символ '?'. p> На аналогічну компенсацію можна нарватися, якщо прочитати символи з текстового файлу за допомогою java.io.FileReader, а потім вивести їх на екран через System.out.println (). Якщо файл був записаний у кодуванні Cp866, то висновок буде йти вірно, за винятком знову ж букви Ш.
Пряма конверсія bytechar.
Ця помилка є улюбленою у зарубіжних програмістів на Java. Вона досить детально розглянута на початку опису. Якщо Ви коли-небудь будете дивитися чужі вихідні коди, то завжди звертайте увагу на явну конверсію типів - (byte) або (char). Досить часто в таких місцях закопані граблі. p> Алгоритм пошуку проблем з російськими буквами
Якщо Ви не уявляєте собі де у Вашій програмі може відбуватися втрата російських букв, то можна спробувати наступний тест. Будь-яку програму можна розглядати як обробник вхідних даних. Російські літери - це такі ж дані, вони проходять в загальному випадку три стадії обробки: вони звідкись читаються в пам'ять програми (вхід), обробляються всередині програми і виводяться користувачеві (Вихід). Для того, щоб визначити місце проблем, треба спробувати замість даних зашити в вихідник таку тестову рядок: "АБВu0410u0411u0412", і спробувати її вивести. Після цього дивіться, що у Вас вивелося:
Якщо Ви побачите "АБВАБВ", значить компіляція початкових кодів і висновок у Вас працюють правильно. p> Якщо Ви побачите "??? АБВ" (або будь-які інші символи крім "АБВ" на місці перших трьох літер), значить висновок працює правильно, але от компіляція ісходников відбувається невірно - скоріш...