C++ 汉字转首字母

it2025-06-08  23

// Test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <iostream> #include <string> using namespace std; static char convert(wchar_t n); static bool In(wchar_t start, wchar_t end, wchar_t code); int main() { string sChinese = "今天天气不错"; // 输入的字符串 char c; char chr[3]; wchar_t wchr = 0; int len = sChinese.length() / 2; char* buff = new char[len]; memset(buff, 0x00, sizeof(char)*sChinese.length() / 2 + 1); for (int i = 0, j = 0; i < (sChinese.length() / 2); ++i) { memset(chr, 0x00, sizeof(chr)); chr[0] = sChinese[j++]; chr[1] = sChinese[j++]; chr[2] = '\0'; // 单个字符的编码 如:'我' = 0xced2 wchr = 0; wchr = (chr[0] & 0xff) << 8; wchr |= (chr[1] & 0xff); buff[i] = convert(wchr); } cout << "pinyin=[" << buff << "]" << endl; return 0; } char convert(wchar_t n) { if (In(0xB0A1, 0xB0C4, n)) return 'a'; if (In(0XB0C5, 0XB2C0, n)) return 'b'; if (In(0xB2C1, 0xB4ED, n)) return 'c'; if (In(0xB4EE, 0xB6E9, n)) return 'd'; if (In(0xB6EA, 0xB7A1, n)) return 'e'; if (In(0xB7A2, 0xB8c0, n)) return 'f'; if (In(0xB8C1, 0xB9FD, n)) return 'g'; if (In(0xB9FE, 0xBBF6, n)) return 'h'; if (In(0xBBF7, 0xBFA5, n)) return 'j'; if (In(0xBFA6, 0xC0AB, n)) return 'k'; if (In(0xC0AC, 0xC2E7, n)) return 'l'; if (In(0xC2E8, 0xC4C2, n)) return 'm'; if (In(0xC4C3, 0xC5B5, n)) return 'n'; if (In(0xC5B6, 0xC5BD, n)) return 'o'; if (In(0xC5BE, 0xC6D9, n)) return 'p'; if (In(0xC6DA, 0xC8BA, n)) return 'q'; if (In(0xC8BB, 0xC8F5, n)) return 'r'; if (In(0xC8F6, 0xCBF0, n)) return 's'; if (In(0xCBFA, 0xCDD9, n)) return 't'; if (In(0xCDDA, 0xCEF3, n)) return 'w'; if (In(0xCEF4, 0xD188, n)) return 'x'; if (In(0xD1B9, 0xD4D0, n)) return 'y'; if (In(0xD4D1, 0xD7F9, n)) return 'z'; return '\0'; } bool In(wchar_t start, wchar_t end, wchar_t code) { if (code >= start && code <= end) { return true; } return false; }

 

Linux下表示Windows下的16位的wchar_t类型可使用unsigned short来表示,也可直接使用C++中的char16_t类型

// Test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <iostream> #include <string> using namespace std; bool between(wchar_t start, wchar_t end, wchar_t aim); char get_first_letter(wchar_t wchar); void get_first_letters(const char *szChinese, char piyinBuf[], const uint32_t maxBufLen, uint32_t &piyinBufLen); int main() { char buf[1024] = { 0 }; uint32_t len = 0; const char *szChinese = "qaz123获取汉字拼音"; get_first_letters(szChinese, buf, 1024, len); printf("%s\n", buf); return 0; return 0; } void get_first_letters(const char *szChinese, char piyinBuf[], const uint32_t maxBufLen, uint32_t &piyinBufLen) { uint8_t chr[3]; piyinBufLen = 0; uint32_t chineseLen = strlen(szChinese); for (uint32_t i = 0; i < chineseLen && piyinBufLen < maxBufLen; ++i) { uint8_t c = szChinese[i]; // 排除askii 码 if (isascii(c)) { piyinBuf[piyinBufLen++] = c; } else { chr[0] = szChinese[i]; chr[1] = szChinese[++i]; chr[2] = 0; wchar_t wchr = 0; wchr = (chr[0] & 0xff) << 8; wchr |= (chr[1] & 0xff); piyinBuf[piyinBufLen++] = toupper(get_first_letter(wchr)); } } } bool between(wchar_t start, wchar_t end, wchar_t aim) { if (start <= aim && aim <= end) { return true; } return false; } char get_first_letter(wchar_t wchar) { if (between(0xB0A1, 0xB0C4, wchar)) return 'a'; if (between(0XB0C5, 0XB2C0, wchar)) return 'b'; if (between(0xB2C1, 0xB4ED, wchar)) return 'c'; if (between(0xB4EE, 0xB6E9, wchar)) return 'd'; if (between(0xB6EA, 0xB7A1, wchar)) return 'e'; if (between(0xB7A2, 0xB8c0, wchar)) return 'f'; if (between(0xB8C1, 0xB9FD, wchar)) return 'g'; if (between(0xB9FE, 0xBBF6, wchar)) return 'h'; if (between(0xBBF7, 0xBFA5, wchar)) return 'j'; if (between(0xBFA6, 0xC0AB, wchar)) return 'k'; if (between(0xC0AC, 0xC2E7, wchar)) return 'l'; if (between(0xC2E8, 0xC4C2, wchar)) return 'm'; if (between(0xC4C3, 0xC5B5, wchar)) return 'n'; if (between(0xC5B6, 0xC5BD, wchar)) return 'o'; if (between(0xC5BE, 0xC6D9, wchar)) return 'p'; if (between(0xC6DA, 0xC8BA, wchar)) return 'q'; if (between(0xC8BB, 0xC8F5, wchar)) return 'r'; if (between(0xC8F6, 0xCBF0, wchar)) return 's'; if (between(0xCBFA, 0xCDD9, wchar)) return 't'; if (between(0xCDDA, 0xCEF3, wchar)) return 'w'; if (between(0xCEF4, 0xD188, wchar)) return 'x'; if (between(0xD1B9, 0xD4D0, wchar)) return 'y'; if (between(0xD4D1, 0xD7F9, wchar)) return 'z'; return '\0'; }

 

最新回复(0)