在Mac中使用C ++读取UTF-8数据无法正常工作

阿尔贝托

尽管我的C ++经验大大减少,但我正在尝试帮助C ++程序员使他的库在Mac上运行。目前,问题似乎仅与语言环境/编码有关。

为了创建一个最小的工作示例,我测试了以下代码,该代码将一行UTF-8字符读取为一个宽字符串(wstring),然后遍历该字符串并打印每个字符。

虽然它在Linux盒子上可以正常工作,所有字符都打印在不同的行中,但是使用Mac盒子时,我得到的是每行打印每个字节(而不是每个字符)。

代码是:

#include <sstream>
#include <iostream> 
#include <string>
#include <boost/locale.hpp>

using namespace std;

int main() {
    std::ios_base::sync_with_stdio(false);
    boost::locale::generator gen;
    locale mylocale = gen("pt_PT.UTF-8");
    locale::global(mylocale);

    wstring userInput;
    getline(wcin, userInput);

    wcerr << "Size of string is " << userInput.length() << endl;

    for (int i = 0; i < userInput.length(); ++i) {
        wcerr << userInput.at(i) << endl;
    }
    return 0;
}

我的测试字符串是一个愚蠢的葡萄牙语句子:

O coração é um órgão frágil.

我正在尝试使用Boost_locale,因为有人告诉我这是他使unicode在Mac上正常工作的方法,但是我很乐于仅使用C ++标准库的解决方案。

编辑:

以下代码在Mac上有效。由于包含codecvt,因此无法在我的Linux机器上进行编译,但是我可以使用一些CPP指令来对其进行管理。

#include <sstream>
#include <iostream> 
#include <fstream>
#include <codecvt>
#include <locale>
#include <string>

using namespace std;

int main() {
    // setting std::local::global seems not to work (??)

    wcin.imbue(std::locale(locale(""), new std::codecvt_utf8<wchar_t>));
    wcerr.imbue(std::locale(locale(""), new std::codecvt_utf8<wchar_t>));

    wstring userInput;
    getline(wcin, userInput);

    wcerr << "Size of string is " << userInput.length() << endl;

    for (int i = 0; i < userInput.length(); ++i) {
        wcerr << userInput.at(i) << endl;
    }
    return 0;
}
伊泰·格鲁杰夫(Itay Grudev)

此行为是由以下事实引起的:在UTF-8编码中,一个字符(也称为代码点)由一个或多个代码单元表示

本质上是:

for (int i = 0; i < userInput.length(); ++i)

遍历代码单元您可以通过userInput.length()数字大于字符串中的字符数来验证该行为

通过做:

wcerr << userInput.at(i) << endl;

您将endl在每个代码单元之后附加一个,从而分隔属于同一代码点的代码单元,这些代码单元会生成无效字符。

如果您只输出:

wcerr << userInput << endl;

您将完整保留您的字符串。

如果要分别输出每个字符,则必须考虑属于同一代码点的多个代码单元并分别输出它们。

更新:

wcin默认情况下不执行到代码点的转换您需要明确声明输入的编码并进行转换。本质上,这是以下代码的作用。您的示例的唯一主要区别是,我使用了C ++ 11标准库而不是Boost

#include <codecvt>
#include <iostream>

int main() {

    std::locale::global( std::locale( std::locale(""), new std::codecvt_utf8<wchar_t> ) );

    std::wcin.imbue( std::locale() );
    std::wcout.imbue( std::locale() );
    std::wcerr.imbue( std::locale() );

    std::wstring user_input;
    std::wcin >> user_input;

    for( int i = 0; i < user_input.length(); ++i ) {
        std::wcout << user_input[i] << std::endl;
    }

    // Converting characters to uppercase
    const std::ctype<wchar_t>& f = std::use_facet<std::ctype<wchar_t>>( std::locale() );

    for( int i = 0; i < user_input.length(); ++i ) {
        std::wcout << f.toupper(user_input[i]) << std::endl; // f.tolower() for lowercase
    }

    return 0;
}

PS要进行编译,您将需要传递C ++ 11标准标志。

g++ -std=c++11 main.cpp

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#StreamReader Encoding.UTF8无法正常工作

来自分类Dev

使用UTF-8读取.txt文件

来自分类Dev

PHP UTF-8无法正常工作

来自分类Dev

Pyserial 无法读取数据但 minicom 工作正常

来自分类Dev

在C#中读取UTF-8文件

来自分类Dev

在Windows上使用fgets()从stdin读取UTF-8

来自分类Dev

如何使用Pandas读取UTF-8文件?

来自分类Dev

使用UTF-8打开文件进行读取

来自分类Dev

使用UTF-8编码读取XML文件

来自分类Dev

在Windows上使用fgets()从stdin读取UTF-8

来自分类Dev

在Python 2中使用通用换行符读取UTF-8文件

来自分类Dev

在Haskell中使用UTF-8作为IO字符串读取文件

来自分类Dev

无法从UTF-8文件读取某些字符。纯C

来自分类Dev

'utf-8' 编解码器无法使用 Pandas 进行解码并读取 xlsx

来自分类Dev

尝试在C中使用sscanf()从文件中读取浮点数,整数和字符串的列表无法正常工作

来自分类Dev

读取C中的bin文件无法正常工作

来自分类Dev

从C中的标准输入读取行的功能无法正常工作

来自分类Dev

使用标准C ++ wifstream读取UTF-8文本并转换为UTF-16

来自分类Dev

TZipFile读取UTF8

来自分类Dev

Inputstream readUTF无法读取UTF

来自分类Dev

UTF 8编码在PHP中无法正常工作

来自分类Dev

用Rmagick中的8位读取无法正常工作?

来自分类Dev

C ++使用宽流读取UTF8缓冲区

来自分类Dev

C ++使用宽流读取UTF8缓冲区

来自分类Dev

如何使用Console.readLine在C#中读取UTF-8中的输入?

来自分类Dev

在Node中使用Express.JS读取req.path中的UTF8字符

来自分类Dev

在数据库表中使用mysqli插入数据无法正常工作?连接是否正常

来自分类Dev

如何使用SSIS将从Windows-1250文件格式读取的数据转换为UTF-8

来自分类Dev

如何使用SSIS将从Windows-1250文件格式读取的数据转换为UTF-8

Related 相关文章

  1. 1

    C#StreamReader Encoding.UTF8无法正常工作

  2. 2

    使用UTF-8读取.txt文件

  3. 3

    PHP UTF-8无法正常工作

  4. 4

    Pyserial 无法读取数据但 minicom 工作正常

  5. 5

    在C#中读取UTF-8文件

  6. 6

    在Windows上使用fgets()从stdin读取UTF-8

  7. 7

    如何使用Pandas读取UTF-8文件?

  8. 8

    使用UTF-8打开文件进行读取

  9. 9

    使用UTF-8编码读取XML文件

  10. 10

    在Windows上使用fgets()从stdin读取UTF-8

  11. 11

    在Python 2中使用通用换行符读取UTF-8文件

  12. 12

    在Haskell中使用UTF-8作为IO字符串读取文件

  13. 13

    无法从UTF-8文件读取某些字符。纯C

  14. 14

    'utf-8' 编解码器无法使用 Pandas 进行解码并读取 xlsx

  15. 15

    尝试在C中使用sscanf()从文件中读取浮点数,整数和字符串的列表无法正常工作

  16. 16

    读取C中的bin文件无法正常工作

  17. 17

    从C中的标准输入读取行的功能无法正常工作

  18. 18

    使用标准C ++ wifstream读取UTF-8文本并转换为UTF-16

  19. 19

    TZipFile读取UTF8

  20. 20

    Inputstream readUTF无法读取UTF

  21. 21

    UTF 8编码在PHP中无法正常工作

  22. 22

    用Rmagick中的8位读取无法正常工作?

  23. 23

    C ++使用宽流读取UTF8缓冲区

  24. 24

    C ++使用宽流读取UTF8缓冲区

  25. 25

    如何使用Console.readLine在C#中读取UTF-8中的输入?

  26. 26

    在Node中使用Express.JS读取req.path中的UTF8字符

  27. 27

    在数据库表中使用mysqli插入数据无法正常工作?连接是否正常

  28. 28

    如何使用SSIS将从Windows-1250文件格式读取的数据转换为UTF-8

  29. 29

    如何使用SSIS将从Windows-1250文件格式读取的数据转换为UTF-8

热门标签

归档