Question

Je viens de recevoir un projet Borland JBuilder 2006 que je ne peux même pas construire. J'ai deux fichiers de ressources, un texte chinois simplifié et l'autre en chinois traditionnel. Lorsque je tente de construire le projet, le texte est mal interprété et il voit un « caractère d'échappement illégal ».

Maintenant, si je mets le codage dans le projet -> Propriétés du projet -> Général -> encodage à GB2312, le texte chinois simplifié affiche correctement. Cependant, la ressource traditionnelle chinoise est encore brouillée.

Je pense que pour le chinois traditionnel, ce paramètre doit être réglé sur Big5 |, mais même cela ne fonctionne pas .. Et quand je mis à Big5, puis en chinois simplifié est corrompu.

Le développeur précédent qui travaillait sur c'était parti sans avoir une chance de me montrer comment construire ce projet ..

Toutes les idées?

Merci,

kreb

Était-ce utile?

La solution

  

On les appelle « Res_SChinese.java » et   "Res_TChinese.java"

Je suppose que ceux-ci doivent être des fichiers de classe Java, bien que je suis surpris qu'ils sont différents encodages.

Avoir des fichiers source dans plusieurs encodages est hautement indésirable. Si vous ne savez pas quel jeu de caractères d'un fichier source a, vous pouvez utiliser le projet ICU bibliothèques pour vous aider deviner :

  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();
    }
  }

Notez que le nombre de codages de caractères chinois, il peut détecter est limitée ( ISO-2022-CN , GB18030 et Big5 |), mais au moins il pourrait vous aider à savoir si tout est codé dans un format de transformation Unicode ou quelque chose.


Eclipse (JBuilder est basé sur Eclipse maintenant, non?) Peut définir des codages pour des fichiers individuels. Vous pouvez définir l'encodage Eclipse utilise un fichier par un clic droit dessus et en sélectionnant Propriétés. L'encodage est sous les propriétés des ressources. il est difficile de gérer et ne sera pas applicable à tous les outils externes que vous utilisez (comme un script de construction Ant).

Il est possible de compiler des fichiers en utilisant un codage différent à l'aide externe. Par exemple:

javac -encoding GB18030 Foo.java

Mais si ces classes ont interdépendances, qui va obtenir rapidement douloureux.


Face à plusieurs codages, je traduirais tous les fichiers à un seul encodage. Il y a deux options ici.

utiliser un sous-ensemble Latin-1

Java prend en charge les séquences d'échappement Unicode dans les fichiers source. Ainsi, le caractère Unicode U + 6874 桴 peut être écrit comme le littéral \ u6874. L'outil native2ascii peut être utilisé pour transformer vos fichiers Java à des valeurs Latin-1.

native2ascii -encoding GB2312 FooIn.java FooOut.java

Les fichiers résultants compilerons probablement nulle part sans problème, mais peut-être un cauchemar pour tous ceux qui lisent / éditer les fichiers.

Utilisez GB18030

GB18030 est un ensemble énorme de caractère, donc si cela est l'encodage natif, il est peut-être une idée d'utiliser cette (sinon, si j'allais cette route, j'utiliser UTF-8).

Vous pouvez utiliser le code comme celui-ci pour effectuer la transformation:

  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);
    }
  }

  

Si je les ouvrir dans le Bloc-notes, je peux les voir à la fois correctement, même avec seulement les paramètres régionaux mis à Chinois (RPC)

Bloc-notes utilise un caractère heuristique codant pour la détection mécanisme. Il ne fonctionne pas toujours .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top