【问题标题】:Wide to narrow characters宽到窄的字符
【发布时间】:2009-12-21 11:03:44
【问题描述】:

将 std::wstring 转换为 std::string 的最简洁方法是什么?我过去使用过 W2A 等宏,但我从未喜欢过它们。

【问题讨论】:

  • 这取决于您想要进行哪种转换。很明显,ASCII中存在的字符可以很容易地缩小范围,但是char使用的字符集中不存在的字符呢?或者哪些有不同的编码?你在乎那些吗?基本上,您想要正确 转换,还是只需要适用于英文字符的转换?
  • 在这种特殊情况下,可以安全地假设所有读取的字符都是窄格式。我正在读取一个只包含窄字符的文件,但是我试图通过返回宽字符串的接口返回此信息。但是,更多案例的完整答案将非常有用。
  • 另外,当我写出他的文件时,我必须将我的 wstrings 变成窄字符。在这种情况下,我可能不得不选择通用的方形显示字符。

标签: c++ windows string stl


【解决方案1】:

您可能正在寻找 icu,这是一个开源、跨平台的库,用于处理 Unicode 和遗留编码以及其他许多事情。

【讨论】:

  • 谢谢,这将在其他项目中有用。
【解决方案2】:

最原生的方式是std::ctype<wchar_t>::narrow(),但这只不过是 gishu 建议的 std::copy 而已,您仍然需要管理自己的缓冲区。

如果您不想进行任何翻译而只是想要一个单行,您可以使用std::string my_string( my_wstring.begin(), my_wstring.end() )

如果您想要实际的编码翻译,您可以使用 locales/codecvt 或另一个答案中的库之一,但我猜这不是您要寻找的。​​p>

【讨论】:

    【解决方案3】:

    由于这是搜索“c++ 窄字符串”的第一批结果之一,而且它是从 C++11 之前开始的,所以这里是 C++11 解决此问题的方法:

    #include <codecvt>
    #include <locale>
    #include <string>
    
    std::string narrow( const std::wstring& str ){
        std::wstring_convert<
            std::codecvt_utf8_utf16< std::wstring::value_type >,
            std::wstring::value_type
        > utf16conv;
        return utf16conv.to_bytes( str );
    }
    

    【讨论】:

      【解决方案4】:

      如果 wstring 中的编码是 UTF-16 并且您想要转换为 UTF-8 编码的字符串,您可以使用 UTF8 CPP 库:

      utf8::utf16to8(wstr.begin(), wstr.end(), back_inserter(str));
      

      【讨论】:

      • 谢谢,我喜欢这个样子。
      【解决方案5】:

      看看这是否有帮助。这个使用 std::copy 来实现你的目标。

      http://www.codeguru.com/forum/archive/index.php/t-193852.html

      【讨论】:

      • 但它只是调用从wchar_tchar 的隐式转换,这基本上是一个整数值的赋值。它仅适用于两种编码中都存在的字符,并且在两种编码中具有相同的表示。
      • 要从 A 转换为 B,在 B 的域中必须有 A 的等价物。必须存在映射..不清楚“两者中的相同表示”是什么意思。
      【解决方案6】:

      我不知道它是否是“最干净的”,但到目前为止我使用 copy() 函数没有任何问题。

      #include <iostream>
      #include <algorithm>
      
      using namespace std;
      
      string wstring2string(const wstring & wstr)     
      {
          string str(wstr.length(),’ ‘);
          copy(wstr.begin(),wstr.end(),str.begin());
          return str;
      }
      
      wstring string2wstring(const string & str) 
      {
          wstring wstr(str.length(),L’ ‘);
          copy(str.begin(),str.end(),wstr.begin());
          return wstr;
      }
      

      http://agraja.wordpress.com/2008/09/08/cpp-string-wstring-conversion/

      【讨论】:

      • 标准编码练习笔记:当通过值传递参数时,您为每个字符串制作一个额外的副本 - 而是通过 const 引用传递它们。
      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 2019-10-17
      • 2018-09-15
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多