【问题标题】:C/C++: libcurl + extended ASCII chars = bad Google Translation API resultC/C++:libcurl + 扩展 ASCII 字符 = 错误的 Google Translation API 结果
【发布时间】:2019-03-11 16:53:22
【问题描述】:

我正在尝试在我的 C/C++ 程序中使用带有 libcurl 的 Google 翻译 API,但每当我翻译带有扩展 ASCII 的内容时,我都会得到一个糟糕的结果。例如,将“nuß”翻译成英语(德语中“nut”的意思)。注意 ß 是一个扩展的 ASCII 字符 (0xDF),你不需要 Unicode 来写它。

"nuß" → Chrome 中的英文

当我在 Chrome 中打开此 URL 时,它成功转换为“nut”: https://translate.googleapis.com/translate_a/single?client=gtx&ie=UTF-8&oe=UTF-8&sl=de&tl=en&dt=t&q=nuß

[[["nut","nuß",null,null,2]],null,"de"

"nuß" → 我的 C/C++ 程序中的英语

当我在 C/C++ 程序中使用相同的 URL 时,它会错误地转换为“nu?”

[[["nu?","nu?",null,null,0]],null,"de"

这是我的程序:

#include <iostream>
#define CURL_STATICLIB
#include "curl/curl.h"

int main() {
    CURL *curl = curl_easy_init();

    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://translate.googleapis.com/translate_a/single?client=gtx&ie=UTF-8&oe=UTF-8&sl=de&tl=en&dt=t&q=nuß");
        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return 0;
}

如果我将 URL 的结尾更改为 nu%DF 而不是 nuß,也会发生同样的情况。

【问题讨论】:

    标签: c++ c libcurl google-translation-api


    【解决方案1】:

    你试过curl_easy_escape吗?当您设置了非 ascii 字符时,首先转义字符串可能是个好主意。请注意,这不关心字符编码(在您的情况下为 utf8)。所以你需要先用一些标准的方式转换编码like this for C++或者iconv对于C/C++。

    【讨论】:

    • 我确实尝试将其转义到nu%DF,结果相同。 ß 是扩展的 ASCII 字符,不需要 Unicode,所以我认为我不需要转换任何东西。
    【解决方案2】:

    我想通了,我需要将 ß 编码为 %C3%9F。我正在使用 ß (%DF) 的 ASCII 代码进行“百分号编码”,而我需要使用 UTF-8 代码。

    【讨论】:

    • 对于未来的读者来说,了解它为什么有效可能会很有用。您可以添加一些关于使用的编码以及为什么需要它的详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多