使用 Google 翻译 Java 库,带有特殊字符的语言 return 问号

Using Google Translate Java Library, Languages with special chars return question marks

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

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

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

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

}

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

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

String encoded = new String(...) 完全错了。刚刚

put(key, value):

请注意,System.out.println 总会有问题,因为 OS 编码可能是某种 Windows ANSI 编码。那么它很可能是非 Unicode-capable - 并且 String 包含 Unicode。