`
konin
  • 浏览: 10201 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

linux string 转wstring

阅读更多
boolUnicode::stringToWstring(conststring&s, wstring&t) {
t.reserve(t.length() +s.length());

wchar_twc;
unsignedintminval;
unsignedcharc;
string::size_typelen;

for (string::size_typei=0;i<s.length();i+=len) {
c=s[i];

if(c<0x80) {
wc=c;
len=1;
minval=0;
}elseif (c<0xC0) {// 10xxxxxx
returnfalse;
}elseif (c<0xE0) {// 110xxxxx
wc=c&0x1F;
len=2;
minval=0x80;
}elseif(c<0xF0) {// 1110xxxx
wc=c&0xF;
len=3;
minval=0x800;
#ifSIZEOF_WCHAR_T>=4
}elseif(c<0xF8) {// 11110xxx
wc=c&7;
len=4;
minval=0x10000;
}elseif(c<0xFC) {// 111110xx
wc=c&3;
len=5;
minval=0x110000;
}elseif(c<0xFE) {// 1111110x
wc=c&1;
len=6;
minval=0x4000000;
#endif
}else{
returnfalse;
}

if(i+len-1<s.length()) {
for(string::size_typej=1;j<len;++j) {
if((s[i+j]&0xC0) !=0x80) {
returnfalse;
}

wc<<=6;
wc|=s[i+j]&0x3f;
}

if(static_cast<unsignedint>(wc) <minval) {
returnfalse;
}else{
t+=wc;
}
}else{
returnfalse;
}
}

returntrue;
}

 

中间用到了一个宏 SIZEOF_WCHAR_T,参考其声明

#ifdefined(_WIN32)
#defineSIZEOF_WCHAR_T2
#elif (defined(__sun) &&defined(__sparc)) || \
      ((defined(__linux) ||defined(__FreeBSD__)) && (defined(__i386) ||defined(__x86_64)))
#defineSIZEOF_WCHAR_T4
#endif

 

0
2
分享到:
评论

相关推荐

    utf-8、ANSI、Unicode相互转化c++实现

    std::wstring ConverANSI2Unicode(const std::string str); std::wstring ConverUTF82Unicode(const std::string str); std::string ConverUnicode2UTF8(const std::wstring str); std::string ConverUnicode2ANSI...

    utf_string_conversion_utils.rar_conversion

    标题"utf_string_conversion_utils.rar_conversion"暗示了我们关注的焦点是UTF(Unicode Transformation Format)字符串转换工具,这通常涉及到不同字符编码之间的转换,特别是针对Linux源代码的情况。UTF是一种广泛...

    JsonCpp解析\u中文乱码_修改源码_完美解决

    JsonCpp可能使用了诸如`std::wstring`或`std::string`来存储字符串,需要确保这些类型在读取和写入时能够正确处理Unicode。 3. **添加或修改编码转换函数**:如果JsonCpp不支持UTF-8,可能需要添加或修改现有的编码...

    C++宽字符与普通字符的转换实例详解

    wstring string2Wstring(string sToMatch) { #ifdef _A_WIN int iWLen = MultiByteToWideChar(CP_ACP, 0, sToMatch.c_str(), sToMatch.size(), 0, 0); wchar_t *lpwsz = new wchar_t[iWLen + 1]; ...

    URL.zip_url_url decode_url linux_url 解码

    在C++中,我们可以使用标准库中的`std::stringstream`、`std::hex`和`std::uppercase`函数来实现URL编码。首先,遍历字符串中的每个字符,检查是否需要编码。如果需要,将其转换为十六进制表示,并添加百分号。对于...

    C++实现编码转换的示例代码

    3. `utf82uni(const std::string& utf8, std::wstring& uni)` 和 `uni2utf8(const std::wstring& uni, std::string& utf8)`: 这两个函数分别用于UTF-8到Unicode和Unicode到UTF-8的转换。虽然Windows API没有直接提供...

    c++通用库针对不同平台封装(win)

    std::wstring getCurrencyPathW(); //输出日志 void Log(std::string info, std::string path = "", LogLevel level = LogLevel::LOG_INFO,bool format = true); void Log(std::string info, LogLevel level); ...

    c++ 获取硬盘序列号

    std::wstring GetHardDriveSerialNumber(const std::wstring& driveLetter) { HKEY hKey; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Mup\\Enum", 0, KEY_READ, &hKey) == ...

    JAVA中获取硬盘序列号源码

    if (kernel32.GetVolumeInformationW(path, new WString(volumeNameBuffer), volumeNameBuffer.length, serialNumber, maxComponentLength, fileSystemFlags, null, 0)) { String serialNumberStr = Integer....

    获取文件的大小 C++代码

    方法四:Linux/Unix `fopen` 和 `fseek` ```cpp #include #include #include &lt;string&gt; int getFileSizeUsingFopen(const std::string& filePath) { FILE* file = fopen(filePath.c_str(), "rb"); if (file) { ...

    用gSOAP开发Web Service程序

    xsd__string = | std::wstring | wchar_t* ``` 这样,SOAP/XML中的字符串类型将会被转换为`std::wstring`或`wchar_t*`,有助于更好地支持中文字符。 - **枚举处理**:默认情况下,wsdl2h生成的枚举类型成员名会...

    快速检索指定文件源码

    对于命令行爱好者,grep命令是Linux和Unix系统中的经典工具,它支持Unicode,并且可以通过管道和其他命令结合,实现复杂的源码检索。 在实际操作中,检索源码不仅要考虑效率,还要考虑结果的准确性。比如,要区分大...

    FD_log.rar_c++ unicode日志

    宽字符类型在Windows平台上通常对应于UCS-2或UTF-16,而在大多数现代Linux和Unix系统上,它们通常表示为UTF-32。 FD_log.c和FD_log.h这两个文件很可能是实现日志系统的源代码文件。`FD_log.c`可能包含函数的实现,...

    C++跨平台处理UTF-8库

    标题提到的"C++跨平台处理UTF-8库"就是为了解决这个问题而设计的,它提供了全面的UTF-8支持,并能在多种操作系统上运行,如Windows、Linux、macOS等。 首先,理解UTF-8编码是非常重要的。UTF-8是一种变长的字符编码...

    摄氏度,摄氏度符号 ℃怎么打,C,C++源码.zip

    在C++中,你可以使用`std::wstring`或者`std::string`配合宽字符来打印"℃"。宽字符在C++中用`L`前缀表示,例如: ```cpp #include #include #include #include &lt;string&gt; int main() { std::locale loc("en_US...

    读取硬盘和U盘的硬件序列号

    例如,在Linux系统中,可以使用`udev`规则或者`/sys/class/block`目录下的文件来读取硬盘和U盘的序列号。在Python中,可以使用`pywin32`库或`psutil`库来实现相同的功能。 总的来说,获取硬件序列号涉及对操作系统...

    gdb 标准库查看脚本.pdf

    包括`std::vector`, `std::list`, `std::map`, `std::multimap`, `std::set`, `std::multiset`, `std::deque`, `std::stack`, `std::queue`, `std::priority_queue`, `std::bitset`, `std::string`和`std::wstring`...

    unicode 字符显示

    在C++中,可以使用`std::string`来存储和操作UTF-8字符串,但需要注意的是,C++标准库的函数如`std::strlen`、`std::strcpy`等不直接支持UTF-8的多字节特性,可能导致意外的行为。 2. **宽字符**:C++提供了宽字符...

    编码问题解决方案

    此外,C++11引入的`std::wstring_convert`和`std::codecvt_utf8`可以帮助处理UTF-8与宽字符之间的转换,但请注意这些功能在C++17中已被弃用。 在解决编码问题时,良好的编程习惯至关重要。例如,始终使用Unicode...

Global site tag (gtag.js) - Google Analytics