C++多字节字符与宽字节字符相互转换


在C++中,多字节字符(如char类型)与宽字节字符(如wchar_t类型)之间的转换,可以通过标准库中的函数实现。这里给出两个基本的转换函数示例:`mbstowcs`和`wcstombs`,它们分别用于将多字节字符串转换为宽字节字符串,以及将宽字节字符串转换回多字节字符串。

### 多字节字符到宽字节字符的转换

使用`mbstowcs`函数。该函数定义在``(或``)头文件中。


#include <iostream>
#include <cstdlib> // 包含mbstowcs
#include <cwchar>  // 包含wchar.h的功能

int main() {
    const char* mbStr = "这是一个测试字符串";
    wchar_t wcStr[100]; // 假设转换后的宽字符数组足够大
    size_t ret = mbstowcs(wcStr, mbStr, sizeof(wcStr) / sizeof(wchar_t));
    if (ret == (size_t)-1) {
        std::cerr << "转换失败" << std::endl;
    } else {
        wprintf(L"%ls\n", wcStr); // 使用wprintf输出宽字符字符串
    }
    return 0;
}

注意:`mbstowcs`函数的第三个参数是目标宽字符数组的大小(以`wchar_t`为单位),用于防止缓冲区溢出。

### 宽字节字符到多字节字符的转换

使用`wcstombs`函数。该函数同样定义在``(或``)头文件中。


#include <iostream>
#include <cstdlib> // 包含wcstombs
#include <cstring> // 包含strlen

int main() {
    const wchar_t* wcStr = L"这是一个测试字符串";
    char mbStr[100]; // 假设转换后的多字节字符串数组足够大
    size_t ret = wcstombs(mbStr, wcStr, sizeof(mbStr));
    if (ret == (size_t)-1) {
        std::cerr << "转换失败" << std::endl;
    } else {
        std::cout << mbStr << std::endl; // 输出多字节字符串
    }
    return 0;
}

注意:`wcstombs`函数的第三个参数也是目标多字节字符串数组的大小(以字节为单位),用于防止缓冲区溢出。

这两个函数在处理特定编码(如UTF-8到UTF-16/32)时可能需要额外的注意,特别是当字符集不是平台默认字符集时。在Windows平台上,还可以使用`MultiByteToWideChar`和`WideCharToMultiByte`函数,它们提供了更多的控制选项,包括指定字符集的代码页。