• 4392阅读
  • 2回复

Qt谁做过获取汉字首字母 [复制链接]

上一主题 下一主题
离线清晨
 

只看楼主 倒序阅读 楼主  发表于: 2014-05-20
网上找的试过后都是错的。
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线kimtaikee

只看该作者 1楼 发表于: 2014-05-20
  1. #include <QDebug>
  2. #include <QTextCodec>
  3. #include <QApplication>
  4. #include <QWidget>
  5. #include <QLineEdit>
  6. #include <QLabel>
  7. #include <QPushButton>
  8. #include <QHBoxLayout>
  9. bool IsNumeric(const QString& str);
  10. bool IsChineseChar(const QString& oriStr);
  11. char Convert(wchar_t n);
  12. bool In(wchar_t start, wchar_t end, wchar_t code);
  13. QString GetChineseFirstChar(const QString& oriStr) {
  14.     if(IsNumeric(oriStr)) {
  15.         return "#";
  16.     } else if(!IsChineseChar(oriStr) && !oriStr.isEmpty()) {
  17.         return oriStr.at(0).toUpper();
  18.     }
  19.     QString strLastName;
  20.     if(oriStr.length() > 1) {
  21.         strLastName = oriStr.at(0);
  22.     } else {
  23.         strLastName = oriStr;
  24.     }
  25.     //
  26.     QTextCodec *codec = QTextCodec::codecForName("GBK");
  27.     QByteArray arr = codec->fromUnicode(strLastName);
  28.     char chr[3];
  29.     wchar_t wchr = 0;
  30.     char* buff = new char[arr.length()/2];
  31.     memset(buff, 0x00, sizeof(char)*arr.length()/2+1);
  32.     for (int i = 0, j = 0; i < (arr.length()/2); ++i)
  33.     {
  34.         memset(chr, 0x00, sizeof(chr));
  35.         chr[0] = arr[j++];
  36.         chr[1] = arr[j++];
  37.         chr[2] = '\0';
  38.         // 单个字符的编码 如:'我' = 0xced2
  39.         wchr = 0;
  40.         wchr = (chr[0] & 0xff) << 8;
  41.         wchr |= (chr[1] & 0xff);
  42.         buff[i] = Convert(wchr);
  43.     }
  44.     QString strBuff(buff);
  45.     delete [] buff;
  46.     return strBuff.toUpper();
  47. }
  48. char Convert(wchar_t n)
  49. {
  50.     if (In(0xB0A1,0xB0C4,n)) return 'a';
  51.     if (In(0XB0C5,0XB2C0,n)) return 'b';
  52.     if (In(0xB2C1,0xB4ED,n)) return 'c';
  53.     if (In(0xB4EE,0xB6E9,n)) return 'd';
  54.     if (In(0xB6EA,0xB7A1,n)) return 'e';
  55.     if (In(0xB7A2,0xB8c0,n)) return 'f';
  56.     if (In(0xB8C1,0xB9FD,n)) return 'g';
  57.     if (In(0xB9FE,0xBBF6,n)) return 'h';
  58.     if (In(0xBBF7,0xBFA5,n)) return 'j';
  59.     if (In(0xBFA6,0xC0AB,n)) return 'k';
  60.     if (In(0xC0AC,0xC2E7,n)) return 'l';
  61.     if (In(0xC2E8,0xC4C2,n)) return 'm';
  62.     if (In(0xC4C3,0xC5B5,n)) return 'n';
  63.     if (In(0xC5B6,0xC5BD,n)) return 'o';
  64.     if (In(0xC5BE,0xC6D9,n)) return 'p';
  65.     if (In(0xC6DA,0xC8BA,n)) return 'q';
  66.     if (In(0xC8BB,0xC8F5,n)) return 'r';
  67.     if (In(0xC8F6,0xCBF0,n)) return 's';
  68.     if (In(0xCBFA,0xCDD9,n)) return 't';
  69.     if (In(0xCDDA,0xCEF3,n)) return 'w';
  70.     if (In(0xCEF4,0xD188,n)) return 'x';
  71.     if (In(0xD1B9,0xD4D0,n)) return 'y';
  72.     if (In(0xD4D1,0xD7F9,n)) return 'z';
  73.     return '\0';
  74. }
  75. bool In(wchar_t start, wchar_t end, wchar_t code)
  76. {
  77.     if (code >= start && code <= end)
  78.     {
  79.         return true;
  80.     }
  81.     return false;
  82. }
  83. int GetChineseCode(const QString& oriStr) {
  84.     QTextCodec *codec = QTextCodec::codecForName("GBK");
  85.     QByteArray arr = codec->fromUnicode(oriStr);
  86.     char chr[3];
  87.     wchar_t wchr = 0;
  88.     char* buff = new char[arr.length()/2];
  89.     memset(buff, 0x00, sizeof(char)*arr.length()/2+1);
  90.     for (int i = 0, j = 0; i < (arr.length()/2); ++i)
  91.     {
  92.         memset(chr, 0x00, sizeof(chr));
  93.         chr[0] = arr[j++];
  94.         chr[1] = arr[j++];
  95.         chr[2] = '\0';
  96.         // 单个字符的编码 如:'我' = 0xced2
  97.         wchr = 0;
  98.         wchr = (chr[0] & 0xff) << 8;
  99.         wchr |= (chr[1] & 0xff);
  100.         buff[i] = Convert(wchr);
  101.     }
  102.     return wchr;
  103. }
  104. bool IsChineseChar(const QString& oriStr)
  105. {
  106.     QTextCodec *codec = QTextCodec::codecForName("GBK");
  107.     QByteArray arr = codec->fromUnicode(oriStr);
  108.     char chr[3];
  109.     wchar_t wchr = 0;
  110.     char* buff = new char[arr.length()/2];
  111.     memset(buff, 0x00, sizeof(char)*arr.length()/2+1);
  112.     for (int i = 0, j = 0; i < (arr.length()/2); ++i)
  113.     {
  114.         memset(chr, 0x00, sizeof(chr));
  115.         chr[0] = arr[j++];
  116.         chr[1] = arr[j++];
  117.         chr[2] = '\0';
  118.         // 单个字符的编码 如:'我' = 0xced2
  119.         wchr = 0;
  120.         wchr = (chr[0] & 0xff) << 8;
  121.         wchr |= (chr[1] & 0xff);
  122.         buff[i] = Convert(wchr);
  123.     }
  124.     QString strBuff(buff);
  125.     return !strBuff.trimmed().isEmpty();
  126. }
  127. bool IsNumeric(const QString& str)
  128. {
  129.     if(str.isEmpty()) {
  130.         return false;
  131.     }
  132.     return str[0].isNumber();
  133. }
  134. class TestWidget : public QWidget
  135. {
  136.     Q_OBJECT
  137. public:
  138.     TestWidget();
  139. private slots:
  140.     void convert();
  141. private:
  142.     QLineEdit* input;
  143.     QLabel* output;
  144. };
  145. TestWidget::TestWidget(): QWidget()
  146. {
  147.     QHBoxLayout* layout = new QHBoxLayout(this);
  148.     input = new QLineEdit(this);
  149.     QPushButton* convertBtn = new QPushButton("=>", this);
  150.     output = new QLabel(this);
  151.     layout->addWidget(input);
  152.     layout->addWidget(convertBtn);
  153.     layout->addWidget(output);
  154.     connect(convertBtn, SIGNAL(clicked()), this, SLOT(convert()));
  155. }
  156. void TestWidget::convert()
  157. {
  158.     QString ch = GetChineseFirstChar(input->text());
  159.     output->setText(ch);
  160. }
  161. int main(int argc, char** argv)
  162. {
  163.     QApplication app(argc, argv);
  164.     TestWidget win;
  165.     win.show();
  166.     return app.exec();
  167. }
  168. #include "main.moc"

离线清晨

只看该作者 2楼 发表于: 2014-05-20
我把那些方法写在Qt Creator里 代码没有报错 但为什么运行后出现这个呃,然后程序异常终止。是不适用Qt Creator么?

专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个