2016-10-04 125 views
0

我想知道是否有更简单的方法(更简练)转换const char_t*std::string_t而不是下面更好的办法。到常量为wchar_t *转换为常量的std :: basic_string的<char_t>

编辑

#ifdef OS_WIN 
#include <tchar.h> 
typedef wchar_t char_t; 
#define CHAR_WIDE 
#else 
typedef char char_t; 
+1

'typedef wchar_t char_t;'你确定吗? – deviantfan

+0

看到编辑请... –

+0

你想做什么?要将'std :: string'转换为'std :: wstring',你应该使用'std :: iconv' – PnotNP

回答

6

从你有typedef S,它归结要一个wchar_t const*字符串转换为std::basic_string<wchar_t>。你可以只通过该wchar_t const*串的范围分成的std::basic_string<wchar_t>构造:

wchar_t const *str = L"abcdefgh"; 
const std::basic_string<wchar_t> script_name(str, str + std::char_traits<wchar_t>::length(str)); 

Live Demo

3

你有三种常见的情况:

  1. wchar_t*必须指向ASCII值只有,并且您想要ASCII码为std::string
  2. wchar_t*可能指向非ASCII字符,你想一个std::string宽字符
  3. wchar_t*可能指向非ASCII字符,你想在UTF-8 std::string

通常情况3是最不可能在程序的其他地方引起问题的最好方式。但它也是最难处理的,因为您需要提供自己的例程来将宽字符转换为UTF-8。网上有很多C++源文件可用于这项工作。

为1:

std::string answer; 
for(i=0;i<N;i++) 
    answer.push_back((char) wcharptr[i]); 

为2,同样的代码,但是你需要模板回答你想要的宽型,显然删除char演员。这就是生活变得困难的原因,为什么会不受欢迎,因为如果不小心的话,最终会出现大量不同类型的std::string

为3:

std::string answer; 
for(i=0;i<N;i++) 
{ 
    char utf8[8]; 
    int Nutf8; 
    int ii; 

    Nutf8 = widetoutf8(utf8, wcharptr[i]); 
    for(ii=0;ii<Nutf8;ii++) 
     answer.push_back(utf8[ii]);  
} 

,您必须提供widetoutf8()或等同。

相关问题