【问题标题】:Do we need to consider encoding (UTF-8) while constructing a string from char* buffer从 char* 缓冲区构造字符串时是否需要考虑编码(UTF-8)
【发布时间】:2014-12-02 09:17:33
【问题描述】:

我正在开发一个 HTTP 客户端模块,该模块在字符缓冲区中接收来自服务器的信息,并且是 UTF-8 编码的。我想从这个字符缓冲区创建一个 std::string 对象。

我可以像这样通过字符缓冲区直接创建一个字符串对象吗?

 std::string receivedstring(receievedbuffer,bufferlength);

这里的receievedbuffer 是char[] 数组,它包含从TCP/IP 连接接收到的数据,bufferlength 包含接收到的字节数。我真的对 UTF-8 这个词感到困惑,我知道它是一种 unicode 编码,在转换之前我是否需要采取任何步骤。

【问题讨论】:

  • 在某些时候 - 当字符串完成时 - 您应该验证 UTF-8 字符串(例如使用 u8_check 等...),因为它来自 Internet,并不是每个字节字符串都是有效的 UTF-8。阅读UTF-8 维基页面。一旦你验证了它,把它放在std::string -for future output-就可以了。
  • 那么,接下来你要对字符串做什么?你想如何存储这个文本?您希望在内部使用哪种编码?
  • @BasileStarynkevitch :这意味着我需要先检查字符缓冲区以检查它是否包含有效的 UTF-8 ,然后我可以继续正常的字符串操作而不必担心编码对吗?
  • 是的。正常的字符串操作适用于经过验证的 UTF-8。然后,如果您决定每个 Unicode 字符串都以 UTF-8 表示(但不是例如 UTF-16),那么您可以继续。但是你需要阅读更多关于 UTF-8 的内容。
  • @DavidHeffernan:我将在内部传递提取的 HTTP 标头。据我了解,UTF-8 编码可以正常工作。

标签: c++ unicode encoding utf-8


【解决方案1】:
std::string receivedstring(receievedbuffer,bufferlength);

它不做任何转换,它只是从receievedbuffer复制到receivedstring

如果您的 receievedbuffer 是 UTF-8 编码的,那么完全相同的字节将存储到 receivedstring

std::string 只是一种存储格式,并不反映其中存储的数据的编码方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 2010-12-01
    • 1970-01-01
    • 2019-04-17
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多