【问题标题】:Using Google Translate Java Library, Languages with special chars return question marks使用谷歌翻译 Java 库,带有特殊字符的语言返回问号
【发布时间】:2019-07-15 11:28:33
【问题描述】:

我已经为我的学徒项目设置了一个 Java 程序,该程序接收一个英语字符串的 JSON 文件,并输出一个在控制台中定义的不同语言的 JSON 文件。法语和意大利语等一些语言会输出正确的翻译,而俄语或日语会输出问号,如下图所示。

我四处搜索,看到我需要获取字符串的字节,然后将其编码为 UTF-8,我确实这样做了,但仍然得到问号,所以我开始使用 Java 内置的标准字符集并尝试了编码/解码字符串的不同方式我试过这个:

这给了我一个不同的输出:Ð?Ñ?ивеÑ?

package com.bis.propertyfiletranslator;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.util.List;

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.translate.Translate;
import com.google.api.services.translate.model.TranslationsListResponse;
import com.google.api.services.translate.model.TranslationsResource;

public class Translator {

    public static Translate.Translations.List list;
    private static final Charset UTF_8 = Charset.forName("UTF-8");
    private static final Charset ISO = Charset.forName("ISO-8859-1");

    public static void translateJSONMapThroughGoogle(String input, String output, String API, String language,
            List<String> subLists) throws IOException, GeneralSecurityException {

        Translate t = new Translate.Builder(GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(), null).setApplicationName("PhoenUX-Google-Translate").build();
        try {

            list = t.new Translations().list(subLists, language).setFormat("text");

            list.setKey(API);

        } catch (GoogleJsonResponseException e) {

            if (e.getDetails().getMessage().equals("Invalid Value")) {
                System.err.println(
                        "\n Language not currently supported, check the accepted language codes and try again.\n\n Language Requested: "
                                + language);
            } else {
                System.out.println(e.getDetails().getMessage());
            }
        }

        for (TranslationsResource translationsResource : response.getTranslations()) {

            for (String key : JSONFunctions.jsonHashMap.keySet()) {

                JSONFunctions.jsonHashMap.remove(key);

                String value = translationsResource.getTranslatedText();
                String encoded = new String(value.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);

                JSONFunctions.jsonHashMap.put(key, encoded);
                System.out.println(encoded);
                break;
            }
        }

        JSONFunctions.outputTranslationsBackToJson(output);
    }

}

所以这是使用谷歌云库,我添加了一个系统输出,以便我可以看到我尝试过的结果,所以这段代码应该是你复制它所需要的全部。

我希望 "Hello" 的输出是 "Привет"(俄语) 实际输出是 ????或 Ð?Ñ?ивеÑ?取决于我使用的编码。

【问题讨论】:

  • String encoded = new String(...) 大错特错。只需put(key, value)。请注意,System.out.println 总是会出现问题,因为操作系统编码可能是某些 Windows ANSI 编码。
  • String(value.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) 是典型的货物崇拜代码页转换。 Java 使用 UTF-16 编码存储 value - 您将此 UTF-16 转换为 UTF-8,然后将字节重新解释为 ISO_8859 - 这是没有意义的。代码页应该在输入和输出阅读器中处理 - 而System.out 不是这项工作的工具。
  • @JoopEggen 如果我让程序继续直接输出到文件中而不是尝试在控制台中查看结果会更好吗?
  • 是的,使用像 Notepad++ 或 JEdit 这样的程序员编辑器,可以处理多种编码。 Files.write(Paths.get("..."), value.getBytes("UTF-8"));
  • @JoopEggen 你先生太棒了你想提交这个作为答案,我会接受它:)

标签: java utf-8 google-translate


【解决方案1】:

String encoded = new String(...) 大错特错。只是

put(key, value):

请注意,System.out.println 总是会出现问题,因为操作系统编码可能是某些 Windows ANSI 编码。那么它很可能是不支持 Unicode 的 - 并且 String 包含 Unicode。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多