2009-07-20 2 views
1

Я только что получил проект в Borland JBuilder 2006, который я даже не могу построить. У меня есть два файла ресурсов: один с упрощенным китайским текстом, а другой - на традиционном китайском. Когда я пытаюсь построить проект, текст неверно истолковывается, и он видит «незаконный escape-символ».JBuilder 2006 множественные кодировки

Теперь, если я установил кодировку в Project -> Project Properties -> General -> Encoding to GB2312, отображается упрощенный текст на китайском языке. Однако традиционный китайский ресурс по-прежнему искажен.

Я думаю, что для традиционного китайца этот параметр должен быть установлен на Big5, но даже это не работает. И когда я устанавливаю его на Big5, тогда упрощенный китайский испортится.

предыдущий разработчик, который работал на этом оставил без получить шанс, чтобы показать мне, как построить этот проект ..

Есть идеи?

Спасибо,

Кребса

+0

Что это за файлы ресурсов? Свойства файлов? – McDowell

+0

Я не уверен, что они называются «Res_SChinese.java» и «Res_TChinese.java». – krebstar

+0

Если я открою их в «Блокноте», я смогу просматривать их как правильно, так и с помощью языка, установленного на китайском (КНР) .. Именно поэтому вы знаете, что китайский (КНР) - это то, что они используют в материковом Китае, это, как правило, упрощенный китайский язык. Поэтому я не знаю, почему традиционный китайский язык прекрасно проявляет себя. Возможно, он также загружает кодовую страницу для него. Однако в JBuilder я могу получить только упрощенный файл с китайским языком. – krebstar

ответ

1

Они называются "Res _ SChinese.java" и "Res _ TChinese.java"

Я предполагаю, что они должны быть Java но я удивлен, что они находятся в разных кодировках.

Наличие исходных файлов в нескольких кодировках крайне нежелательно. Если вы не знаете, какой набор символов исходного файла имеет, вы можете использовать ICU project библиотеки, чтобы помочь вам guess:

public static void main(String[] args) throws IOException { 
    InputStream file = new FileInputStream(args[0]); 
    try { 
     file = new BufferedInputStream(file); 
     CharsetDetector detector = new CharsetDetector(); 
     detector.setText(file); 
     String tableTemplate = "%10s %10s %8s%n"; 
     System.out.format(tableTemplate, "CONFIDENCE", 
      "CHARSET", "LANGUAGE"); 
     for (CharsetMatch match : detector.detectAll()) { 
     System.out.format(tableTemplate, match 
      .getConfidence(), match.getName(), match 
      .getLanguage()); 
     } 
    } finally { 
     file.close(); 
    } 
    } 

Обратите внимание, что количество китайских кодировок он может обнаружить ограничен (ISO-2022-CN, GB18030 and Big5), но по крайней мере, это может помочь вам узнать, все ли просто закодировано в формате преобразования Unicode или что-то в этом роде.


Затмение (JBuilder является Eclipse, основанный сейчас, не так ли?) Можно установить кодировку для отдельных файлов. Вы можете настроить кодирование Eclipse для файла, щелкнув его правой кнопкой мыши и выбрав «Свойства». Кодировка находится в свойствах ресурса. это трудно управлять и не будет применяться к любым внешним инструментам, которые вы используете (например, скрипт сборки Ant).

С помощью внешнего можно скомпилировать файлы с использованием другой кодировки. Например:

javac -encoding GB18030 Foo.java 

Но если эти классы имеют взаимозависимости, это будет болезненно быстро.


Столкнувшись с несколькими кодировками, я бы перевел все файлы на одну кодировку. Здесь есть пара вариантов.

Используйте Latin-1 подмножество

Java поддерживает управляющие последовательности Unicode в исходных файлах. Итак, символ Unicode U + 6874 & # x6874; может быть записано как буква \ u6874. Инструмент JDK native2ascii можно использовать для преобразования ваших файлов Java в значения Latin-1.

native2ascii -encoding GB2312 FooIn.java FooOut.java 

Результирующие файлы, вероятно, будут скомпилированы в любом месте без проблем, но могут стать кошмаром для тех, кто читает/редактирует файлы.

Использование GB18030

GB18030 огромный набор символов, так что, если это ваше родное кодирование, это может быть идеей использовать это (в противном случае, если бы я шел по этому пути, я хотел бы использовать UTF -8).

Вы можете использовать такой код для выполнения преобразования:

public static void main(String[] args) throws IOException { 
    changeEncoding("in_cn.txt", Charset.forName("GBK"), 
     "out_cn.txt", Charset.forName("GB18030")); 
    } 

    private static void changeEncoding(String inFile, 
     Charset inCharset, String outFile, Charset outCharset) 
     throws IOException { 
    InputStream in = new FileInputStream(inFile); 
    Reader reader = new InputStreamReader(in, inCharset); 
    OutputStream out = new FileOutputStream(outFile); 
    Writer writer = new OutputStreamWriter(out, outCharset); 
    copy(reader, writer); 
    writer.close(); 
    reader.close(); 
    // TODO: try/finally blocks; proper stream handling 
    } 

    private static void copy(Reader reader, Writer writer) 
     throws IOException { 
    char[] cbuf = new char[1024]; 
    while (true) { 
     int r = reader.read(cbuf); 
     if (r < 0) { break; } 
     writer.write(cbuf, 0, r); 
    } 
    } 

Если открыть их в блокноте, я могу просматривать их как правильно, даже только с локали, установленной на Китайский (КНР)

Блокнот использует эвристический знак encoding detection механизм. It doesn't always work.

+0

Черт, отличный ответ! +100000000: D Спасибо .. И да, файлы, похоже, находятся в нескольких кодировках: S Я нашел быстрое решение, хотя выясняется, что установка языкового стандарта для программ, не связанных с Юникодом, на китайский КНР достаточно, мне пришлось изменить настройку «Форматы» на китайский (КНР). Это позволило мне скомпилировать проект отлично (и просмотреть файлы в порядке). Тем не менее, ваш пост был весьма полезен, и я мог бы просто использовать их позже, чтобы преобразовать их все в UTF8 .. :) Спасибо :) – krebstar

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