【问题标题】:How to convert wstring to string as escapes如何将 wstring 转换为字符串作为转义符
【发布时间】:2013-03-21 14:21:12
【问题描述】:

我有一个 wstring,将它转换为 \u043d\u043e\u043c\u0430 等转义形式的字符串的最佳方法是什么?

下面的一个可行,但似乎不是最好的:

string output; 
for (wchar_t chr : wtst) {
    char code[7];
    sprintf(code,"\\u%0.4X",chr);
    output += code;
}

【问题讨论】:

  • 如果它“似乎不是最好的”,我可以问一下你在 (a) 将它与什么进行比较,以及 (b) 你为什么不使用 that我>?
  • 它并不紧凑,需要几行代码。我认为在 boost 或 std 中可能已经有一些单线转换器。
  • 标准库中没有这个转换器,如果在boost中有一个转换器,它很难比六行实现代码更紧凑。 caller 方(你)当然会被显着压缩,比例约为。如果存在这样的转换器确实,则为 83%。再说一次,引入的依赖肯定会大于六行。你能让this更有效率吗?一定。从.reserve()ing 开始。
  • @WhozCraig 你能把你的评论作为答案吗?我会接受的。

标签: c++ boost wstring


【解决方案1】:

一个不太紧凑但速度更快的版本,a) 提前分配 b) 避免 printf 每次迭代都重新解释格式字符串的成本,c) 避免 printf 的函数调用开销。

std::wstring wstr(L"\x043d\x043e\x043c\x0430");
std::string sstr;
// Reserve memory in 1 hit to avoid lots of copying for long strings.
static size_t const nchars_per_code = 6;
sstr.reserve(wstr.size() * nchars_per_code); 
char code[nchars_per_code];
code[0] = '\\';
code[1] = 'u';
static char const* const hexlut = "0123456789abcdef";
std::wstring::const_iterator i = wstr.begin();
std::wstring::const_iterator e = wstr.end();
for (; i != e; ++i) {
    unsigned wc = *i;
    code[2] = (hexlut[(wc >> 12) & 0xF]);
    code[3] = (hexlut[(wc >> 8) & 0xF]);
    code[4] = (hexlut[(wc >> 4) & 0xF]);
    code[5] = (hexlut[(wc) & 0xF]);
    sstr.append(code, code + nchars_per_code);
}

【讨论】:

  • 您还可以通过使用指针直接写入字符串来进一步加快速度。并非所有编译器都能够在 basic_string::append 中完全内联函数调用。
猜你喜欢
  • 2014-10-18
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2011-05-20
  • 1970-01-01
相关资源
最近更新 更多