C ++在变量

时间:2018-07-13 08:52:34

标签: c++ unicode unicode-string

我正在尝试输出包含Unicode字符的字符串,该字符串通过curl调用接收。因此,我正在寻找类似于u8L的文字字符串选项,但不适用于变量。例如:

const char *s  = u8"\u0444";

但是,由于我有一个包含Unicode字符的字符串,例如:

mit freundlichen Grüßen

当我要使用以下命令打印此字符串时:

cout << UnicodeString << endl;

它输出:

mit freundlichen Gr??en

当我使用wcout时,它返回我:

mit freundlichen Gren

我在做错什么,如何获得正确的输出。我用RapidJSON返回了输出,它返回的字符串为:

mit freundlichen Gr��en

值得注意的是,该应用程序是在Ubuntu上运行的CGI,可响应浏览器请求

3 个答案:

答案 0 :(得分:1)

在我的系统上,以下命令会产生正确的输出。在您的系统上尝试。我相信它将产生类似的结果。

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string s="mit freundlichen Grüßen";
    cout << s << endl;
    return 0;
}

如果还可以,则表明Web传输不是8位干净的。

迈克。

答案 1 :(得分:0)

  

包含unicode字符

您忘记指定字符串包含的 Unicode编码。有一个“狭窄的” UTF-8,它可以存储在std::string中并使用std::cout打印,而不能使用的更宽的变体。了解您要处理的编码至关重要。在我剩下的答案中,我假设您要使用UTF-8。


  

当我要使用以下命令打印此字符串时:

cout << UnicodeString << endl;

编辑:

  

重要的是,该应用程序是在Ubuntu上运行的CGI,可响应浏览器请求

这里的关注点与在终端上打印稍有不同。

  1. 您需要适当设置Content-Type响应头,否则客户端将不知道如何解释响应。例如Content-Type: application/json; charset=utf-8
  2. 您仍然需要确保源字符串实际上是与标题对应的正确编码。有关概述,请参见下面的旧答案。
  3. 浏览器必须支持编码。大多数现代浏览器已经很久以来就支持UTF-8。

有关打印到终端的答案:

假设

  1. UnicodeString确实包含UTF-8编码的字符串
  2. 并且终端使用UTF-8编码
  3. 并且终端使用的字体具有您使用的字形

以上应该可以。

  

它输出:

mit freundlichen Gr??en

然后看来,以上假设至少不成立。

是否为1.,可以通过分别检查每个代码单元的数值并将其与UTF-8的期望值进行比较来进行验证。如果1.不正确,则需要确定字符串实际使用的编码,然后转换编码,或配置终端以使用该编码。

  1. 终端通常(但不一定)使用系统本机编码。弄清楚您的终端/系统使用哪种编码的第一步是弄清楚您正在使用的终端/系统。详细信息可能在手册中。

    如果终端使用UTF-8,则需要将程序中的UFT-8字符串转换为终端使用的字符编码-除非该编码不有您要打印的字素。不幸的是,标准库没有提供任意的字符编码转换支持(有一些支持在窄和宽unicode之间进行转换,但甚至不赞成使用该支持)。您可以找到unicode标准here,尽管我想指出的是,使用现有的转换实现可以节省很多工作。

    在终端的字符编码没有所需的小标题的情况下,或者如果您不想实现编码转换,则是将终端重新配置为使用UTF-8。如果可以将终端/系统配置为使用UTF-8,则手册中应该有详细信息。

  2. 您应该能够简单地通过在终端上键入字符来测试字体本身是否具有所需的字形,并查看它们是否按应有的方式显示-尽管,如果终端编码不正确,该测试也会失败有字素,所以先检查一下。终端的手册应说明如何更改字体(如有必要)。就是说,我希望üß存在于大多数字体中。

答案 2 :(得分:0)

如果您使用的是Windows,我建议在Windows边界使用 Unicode UTF-16

在我看来,在装有Visual C ++的Windows上(至少在VS2015以下)std::cout 不能输出UTF-8编码的文本,但是 {{1} } 正确输出 UTF-16 编码的文本。

此可编译代码段正确输出了包含德语字符的字符串:

std::wcout

请注意使用 UTF-16编码 #include <fcntl.h> #include <io.h> #include <iostream> int main() { _setmode(_fileno(stdout), _O_U16TEXT); // ü : U+00FC // ß : U+00DF const wchar_t * text = L"mit freundlichen Gr\u00FC\u00DFen"; std::wcout << text << L'\n'; } 字符串。

enter image description here


更笼统地说,我建议您在跨平台的中使用 UTF-8编码(例如,将文本存储在wchar_t中) em> C ++代码部分,并在 Windows 边界将其转换为 UTF-16编码的文本。

要在UTF-8和UTF-16之间转换,可以使用Windows API,例如std::stringMultiByteToWideChar。这些都是C API,可以安全方便地用C ++代码包装(更多详细信息可以在this MSDN article中找到,您可以找到compilable C++ code here on GitHub)。