【问题标题】:Pass basic_string<char16_t> to methodes that only accept wchar_t * and char *将 basic_string<char16_t> 传递给只接受 wchar_t * 和 char * 的方法
【发布时间】:2013-11-14 23:46:02
【问题描述】:

当只能获取存储在char16_t的basic_string中的值时,如何使用只接受char *和wchar_t *的方法?

例如在 cstdio 中删除。

  • cstdio 中的remove 函数只接受char * 和wchar_t *。
  • 您无法将 char16_t 转换为 wstring:link
  • Char 无法处理所有 UTF-16 字符

【问题讨论】:

  • 参考您链接到的同一个表:将 UTF-16 转换为多字节,将多字节转换为宽字符。
  • @KerrekSB 一些数据会在这个过程中丢失。当您的字符串包含例如 ґ 字符时。比您的输出不再“有效”。

标签: c++ linux windows c++11


【解决方案1】:

您需要将卡在std::basic_string&lt;char16_t&gt; 中的UTF-16 转码为以std::stringchar const* 作为参数的任何函数所使用的正确编码。同样,在定位基于wchar_t 的序列时,您需要更改编码。当然,由于人们已经抛弃了在内部处理字符而不是编码的想法,因此提供合适的工具来处理编码之间的变化会很有用。有两种方法可以处理字节和字符之间的编码/解码,即std::codecvt&lt;...&gt; 和多字节转换系列函数(例如,mbtowc()

适合的转换还取决于目标 API:并非所有 API 都能够合理处理,例如 UTF-8。转换可能涉及实际支持的字符的选择。

【讨论】:

  • 我想支持 UTF 16,所以当发送 UTF 16 字符时,我希望能够使用该字符。 wchar_t 和 char16_t 都能够支持 UTF-16。为什么我不能在不丢失数据的情况下转换这些类型? wctomb 不适合这个,你最终会在 windows 上使用 UTF-8。例如:pastebin.com/MVWjxmqm
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多