简单起见,category直接填LC_ALL,locale是这种形式的:language[_territory][.codeset][@modifier],我们一般填前3个,比如:zh_CN.UTF-8char *setlocale(int category, const char *locale);
setlocale(LC_ALL, NULL); // 不设置locale,返回当前localesetlocale(LC_ALL, ""); // 使用环境变量中的localesetlocale(LC_ALL, "C") // Linux C程序里面locale一般是"C"
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,不过打印的宽字符。
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.hsnprintf(buf, sizeof (buf), "/proc/self/fd/%d", fd);if (readlink(buf, file_path, sizeof(file_path) - 1) != -1) {return std::string (file_path);}return "";}
3. 实例:过滤除大小写字母外的所有字符FILE *p = freopen(get_file_name(1).c_str(), "w", stdout);
string retainAlphabetWchar(const string &strSrc, const string &locale = "zh_CN.UTF-8"){int iLen = strSrc.length();if (strSrc.empty() || 0 == iLen){printf("Input string is empty!\n");return "";}if(iLen > 128){printf("src string is too long, iLen: %d\n", iLen);return strSrc;}// 获取之前的localechar *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;strDst.erase(0, strDst.find_first_not_of(" "));strDst.erase(strDst.find_last_not_of(" ") + 1);printf("strSrc string is [%s], strDst string is [%s]\n", strSrc.c_str(), strDst.c_str());// 恢复之前的localesetlocale(LC_ALL, pOldLocale);return strDst;}
联系客服