【问题标题】:Read a utf8 file to a std::string without BOM将 utf8 文件读取到没有 BOM 的 std::string
【发布时间】:2015-12-12 05:20:07
【问题描述】:

我正在尝试读取一个 utf8 内容到 char*,我的文件没有任何 DOM,所以代码是直的,(文件是unicode punctuation

char* fileData = "\u2010\u2020";

我看不出单个 unsigned char 0 > 255 怎么能包含值 0 > 65535 的字符,所以我一定是遗漏了一些东西。

...
std::ifstream fs8("../test_utf8.txt");
if (fs8.is_open()) 
{
  unsigned line_count = 1;
  std::string line;
  while ( getline(fs8, line)) 
  {
    std::cout << ++line_count << '\t' << line << L'\n';
  }
}
...

那么如何将 utf8 文件读入 char*,(甚至是 std::string)

【问题讨论】:

    标签: c++11 unicode utf-8


    【解决方案1】:

    好吧,您正在正确地将文件读入std::stringstd::string 确实支持UTF8,可能是您的控制台 * 不能显示非ASCII 字符。

    基本上,当字符代码页大于CHAR_MAX/2 时,您只需用many 字符表示该字符。 如何和多少个字符?这就是编码的全部意义所在。 例如,UTF32 会将每个字符、ASCII 和非 ASCII 显示为 4 个字符。因此“32”(每个字节为 8 位,4*8 = 32)。

    如果不提供有关您使用的操作系统的任何试听信息,我们无法就您的程序如何显示文件行提供建议。

    *或更准确地说,标准输出可能会被实现为控制台文本。

    【讨论】:

    • 我不是想将代码输出到控制台,而是我将它传递给 pcre,如果我直接执行 'char* fileData = "\u2010\u2020";'那么如果我尝试读取完全相同的数据,我可以使用 '/p{P}',该值是垃圾并且正则表达式不再起作用。
    • 我使用的是 Visual Studio 2015,但我使用的是 C++11,没有特定的“窗口”。
    • 该值不是垃圾,它是 utf8 编码的。你可以用谷歌搜索更多关于 和 utf8 的信息。在此处阅读更多信息,例如:stackoverflow.com/questions/11254232/…
    • @SimonGoodman:您不能像您展示的那样将"\u2010\u2020" 字符串文字分配给char*。您必须改用wchar_t*wchar_t *filedata = L"\u2010\u2020";。在任何情况下,如果您的 PCRE 库支持 UTF-8 字符串,您只需将文件中的 UTF-8 数据(UTF-8 是 8 位 - 因此它的名称 - 因此可以放入 char 元素)读取到 std::string ,正如您所展示的那样。 getline() 会将 raw 文件数据读入std::string,然后如果需要char* 输入,您可以使用std::string::c_str() 将数据传递给PCRE 库。
    • @RemyLebeau 从理论上讲,如果字符串文字是有效的 utf8,他可以将其分配给带有 u8 前缀的 const char*
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    相关资源
    最近更新 更多