JBuilder 2006 несколько кодировок - PullRequest
1 голос
/ 20 июля 2009

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

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

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

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

Есть идеи?

Спасибо

Креб

1 Ответ

1 голос
/ 21 июля 2009

Они называются "Res & # x5F; SChinese.java" и "Res & # x5F; TChinese.java"

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

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

  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 и Big5 ), но, по крайней мере, это может помочь вам выяснить, все ли закодировано в Формат преобразования Unicode или что-то.


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

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

javac -encoding GB18030 Foo.java

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


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

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

Java поддерживает escape-последовательности 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);
    }
  }

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

Блокнот использует эвристический механизм обнаружения кодирования . Это не всегда работает .

...