linux宽字符串,linuxC宽字符wchar_t处理
如果字符都是ascii字符,声明成char类型就可以处理了,更节省空间。当遇到中⽂等⾮ascii字符时,如果要逐字符处理,这时就需要⽤到wchar_t了。
⼀、编码
讲宽字符前,需要了解字符编码。GBK只适合中⽂,UTF-8适合所有字符。
UTF-8编码是Unicode的传输形式,也就是说UTF-8便于⽹络传输。详细介绍:
⼆、Linux宽字符处理
对编码有所了解后,我们来看看Linux下的宽字符wchar_t怎么处理。
1. 本地化设置
进⾏宽字符处理之前,需要调⽤函数setlocale进⾏本地化设置。
char *setlocale(int category, const char *locale);
简单起见,category直接填LC_ALL,locale是这种形式的:language[_territory][.codeset][@modifier],我们⼀般填前3个,⽐如:zh_CN.UTF-8setlocale(LC_ALL, NULL); // 不设置locale,返回当前locale
setlocale(LC_ALL, ""); // 使⽤环境变量中的locale
setlocale(LC_ALL, "C") // Linux C程序⾥⾯locale⼀般是"C"
2. 宽字符函数
wcs:wide char string
size_t wcslen(const wchar_t *s); 字符串长度
wchar_t *wmemset(wchar_t *wcs, wchar_t wc, size_t n);  // 注意这个n是宽字符数,⽽不是字节数。
size_t mbstowcs(wchar_t *dest, const char *src, size_t n); 多字节转宽字符,也就是char*类型的字符串转wchar_t*类型的字符串。
size_t wcstombs(char *dest, const wchar_t *src, size_t n);
int wprintf(const wchar_t *format, ...); 相当于printf,不过打印的宽字符。
这⾥需要注意的是宽字符输出stream和char类型输出stream不能共⽤,输出stream的类型由输出的第⼀字节决定,第⼀字节是宽字符,那么stream就只能输出宽字符了,调printf不会打印char类型的字符串到终端,需要调⽤freopen重新打开stdout,才能printf。如下所⽰:
wprintf(L"1\n");
FILE *p = freopen("/dev/tty", "w", stdout);
if(NULL == p)
fprintf(stderr, "fdopen error: %d, %s\n", errno, strerror(errno));
printf("2\n");
在⽹上还到另⼀种freopen stdout的⽅式:
#include
string get_file_name (const int fd)
{
if (0 > fd) {
return "";
}
char buf[1024] = {"\0"};
char file_path[PATH_MAX] = {"0"}; // PATH_MAX in limits.h
snprintf(buf, sizeof (buf), "/proc/self/fd/%d", fd);
if (readlink(buf, file_path, sizeof(file_path) - 1) != -1) {
return std::string (file_path);
}
return "";
printf怎么输出字符
}
然后这样调⽤重新打开stdout:
FILE *p = freopen(get_file_name(1).c_str(), "w", stdout);
3. 实例:过滤除⼤⼩写字母外的所有字符
string retainAlphabetWchar(const string &strSrc, const string &locale = "zh_CN.UTF-8") {
int iLen = strSrc.length();
if (pty() || 0 == iLen)
{
printf("Input string is empty!\n");
return "";
}
if(iLen > 128)
{
printf("src string is too long, iLen: %d\n", iLen);
return strSrc;
}
// 获取之前的locale
char *pOldLocale = setlocale(LC_ALL, NULL);
if (NULL == pOldLocale)
{
printf("Get old locale info failed!\n");
}
setlocale(LC_ALL, locale.c_str());
wchar_t wcsDst[128];
wmemset(wcsDst, 0, sizeof(wcsDst) / sizeof(wchar_t));
mbstowcs(wcsDst, strSrc.c_str(), iLen);
for (int i = 0; i < wcslen(wcsDst); ++i)
{
wchar_t wcTmp = wcsDst[i];
bool bLegalCharFlag = (wcTmp >= L"a" && wcTmp <= L"z")
|| (wcTmp >= L"A" && wcTmp <= L"Z");
if (!bLegalCharFlag)
{
wcsDst[i] = L" ";
}
}
char cDst[512] = {0};
wcstombs(cDst, wcsDst, sizeof(wcsDst));
string strDst = cDst;
printf("strSrc string is [%s], strDst string is [%s]\n", strSrc.c_str(), strDst.c_str()); // 恢复之前的locale
setlocale(LC_ALL, pOldLocale);
return strDst;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。