这个问题有点模糊,不好回答,嘻嘻
只要你拥有了这个数据库,那么查询就不是问题,只要你输入首字母,在你编写的C#与数据库打交道的语句中,你用一个模糊查询方法,把输入的首字母(汉字的首字母HZ)设为查询条件,那么执行的时候C#就会从数据库中将满足条件的(如满足HZ)的全部数据从数据库中读取出来
我做过一个简单的KTV系统,其中拼音点歌就用到这个。
希望我的回答能够帮到你
<php
include('Common/dbphp'); //数据库连接类
$db=new DB();
$shouzimu=strtoupper("r"); //传过来的参数
$arr=$db->get_all("SELECT FROM [user]");
foreach($arr as $rs){
$panduan=ff_letter_first($rs['uname']);//调用下面的方法
if($panduan==$shouzimu){
print_r($rs);
}
}
//生成字母前缀
function ff_letter_first($s0){
$firstchar_ord=ord(strtoupper($s0{0}));
if (($firstchar_ord>=65 and $firstchar_ord<=91)or($firstchar_ord>=48 and $firstchar_ord<=57)) return $s0{0};
$s=iconv("UTF-8","gb2312", $s0);
$asc=ord($s{0})256+ord($s{1})-65536;
if($asc>=-20319 and $asc<=-20284)return "A";
if($asc>=-20283 and $asc<=-19776)return "B";
if($asc>=-19775 and $asc<=-19219)return "C";
if($asc>=-19218 and $asc<=-18711)return "D";
if($asc>=-18710 and $asc<=-18527)return "E";
if($asc>=-18526 and $asc<=-18240)return "F";
if($asc>=-18239 and $asc<=-17923)return "G";
if($asc>=-17922 and $asc<=-17418)return "H";
if($asc>=-17417 and $asc<=-16475)return "J";
if($asc>=-16474 and $asc<=-16213)return "K";
if($asc>=-16212 and $asc<=-15641)return "L";
if($asc>=-15640 and $asc<=-15166)return "M";
if($asc>=-15165 and $asc<=-14923)return "N";
if($asc>=-14922 and $asc<=-14915)return "O";
if($asc>=-14914 and $asc<=-14631)return "P";
if($asc>=-14630 and $asc<=-14150)return "Q";
if($asc>=-14149 and $asc<=-14091)return "R";
if($asc>=-14090 and $asc<=-13319)return "S";
if($asc>=-13318 and $asc<=-12839)return "T";
if($asc>=-12838 and $asc<=-12557)return "W";
if($asc>=-12556 and $asc<=-11848)return "X";
if($asc>=-11847 and $asc<=-11056)return "Y";
if($asc>=-11055 and $asc<=-10247)return "Z";
return 0;//null
}
>
方法一:建一个拼音表 t_cosler ,存放每个字母开头的第一个汉字的编号和最后一个汉字的编号。 +------+--------+-------+ | f_PY | cBegin | cEnd | +------+--------+-------+ | A | 45217 | 45252 | | B | 45253 | 45760 | | Z | 54481 | 55289 | +------+--------+-------+ 然后直接查询就行了。
mysql> create table t_cosler( -> f_PY char primary key, -> cBegin SMALLINT UNSIGNED not null, -> cEnd SMALLINT UNSIGNED not null -> ); Query OK, 0 rows affected (009 sec) mysql> insert into t_cosler values -> ('A',0xB0A1,0xB0C4), -> ('B',0xB0C5,0xB2C0), -> ('C',0xB2C1,0xB4ED), -> ('D',0xB4EE,0xB6E9), -> ('E',0xB6EA,0xB7A1), -> ('F',0xB7A2,0xB8C0), -> ('G',0xB8C1,0xB9FD), -> ('H',0xB9FE,0xBBF6), -> ('J',0xBBF7,0xBFA5), -> ('K',0xBFA6,0xC0AB), -> ('L',0xC0AC,0xC2E7), -> ('M',0xC2E8,0xC4C2), -> ('N',0xC4C3,0xC5B5), -> ('O',0xC5B6,0xC5BD), -> ('P',0xC5BE,0xC6D9), -> ('Q',0xC6DA,0xC8BA), -> ('R',0xC8BB,0xC8F5), -> ('S',0xC8F6,0xCBF9), -> ('T',0xCBFA,0xCDD9), -> ('W',0xCDDA,0xCEF3), -> ('X',0xCEF4,0xD188), -> ('Y',0xD1B9,0xD4D0), -> ('Z',0xD4D1,0xD7F9); Query OK, 23 rows affected (016 sec) Records: 23 Duplicates: 0 Warnings: 0 mysql> select from o_personnel; +------+------------+ | A_Id | A_UserName | +------+------------+ | 1 | 首先 | | 2 | 检查 | | 3 | 我们 | | 4 | 的二 | | 5 | 进制 | | 6 | 是否 | | 7 | 适合 | | 8 | 你的 | | 9 | 平台 | +------+------------+ 9 rows in set (000 sec) mysql> select p,c -> from o_personnel p , t_cosler c -> where CONV(HEX(left(A_UserName,1)),16,10) between ccBegin and ccEnd; +------+------------+------+--------+-------+ | A_Id | A_UserName | f_PY | cBegin | cEnd | +------+------------+------+--------+-------+ | 4 | 的二 | D | 46318 | 46825 | | 2 | 检查 | J | 48119 | 49061 | | 5 | 进制 | J | 48119 | 49061 | | 8 | 你的 | N | 50371 | 50613 | | 9 | 平台 | P | 50622 | 50905 | | 1 | 首先 | S | 51446 | 52217 | | 6 | 是否 | S | 51446 | 52217 | | 7 | 适合 | S | 51446 | 52217 | | 3 | 我们 | W | 52698 | 52979 | +------+------------+------+--------+-------+ 9 rows in set (000 sec) mysql> 查S开头的
mysql> select p -> from o_personnel p , t_cosler c -> where CONV(HEX(left(A_UserName,1)),16,10) between ccBegin and ccEnd -> and cf_PY='S'; +------+------------+ | A_Id | A_UserName | +------+------------+ | 1 | 首先 | | 6 | 是否 | | 7 | 适合 | +------+------------+ 3 rows in set (000 sec) mysql> 方法二:不用这个t_cosler表,直接写个函数权限汉字得到拼音。
局限性: 以上方法,均依照汉字区位表来实现,对区位后面的复杂字,无法准确判断,对多音字无法准确判断。
方法三:从微软拼音中导出所有汉字的拼音表。方法四不建表 mysql> SELECT , -> ELT(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10), -> 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0 xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCE F4,0xD1B9,0xD4D1), -> 'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q', 'R','S','T','W','X','Y','Z') as PY -> from o_personnel; +------+------------+------+ | A_Id | A_UserName | PY | +------+------------+------+ | 1 | 首先 | S | | 2 | 检查 | J | | 3 | 我们 | W | | 4 | 的二 | D | | 5 | 进制 | J | | 6 | 是否 | S | | 7 | 适合 | S | | 8 | 你的 | N | | 9 | 平台 | P | +------+------------+------+ 9 rows in set (000 sec) mysql> 方法五: mysql> SELECT , -> CHAR(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10), -> 0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE, -> 0xBBF7,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE, -> 0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCDDA,0xCDDA,0xCEF4, -> 0xD1B9,0xD4D1)+64) as PY -> from o_personnel; +------+------------+------+ | A_Id | A_UserName | PY | +------+------------+------+ | 1 | 首先 | S | | 2 | 检查 | J | | 3 | 我们 | W | | 4 | 的二 | D | | 5 | 进制 | J | | 6 | 是否 | S | | 7 | 适合 | S | | 8 | 你的 | N | | 9 | 平台 | P | +------+------------+------+ 9 rows in set (000 sec) mysql>
这个可以参考一下:
{
// 简体中文的编码范围从B0A1(45217)一直到F7FE(63486)
private static int BEGIN = 45217;
private static int END = 63486;
// 按照声母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字。
// i, u, v都不做声母, 自定规则跟随前面的字母
private static char[] chartable = { '啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈',
'哈', '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌',
'塌', '挖', '昔', '压', '匝', };
// 二十六个字母区间对应二十七个端点
// GB2312码汉字区间十进制表示
private static int[] table = new int[27];
// 对应首字母区间表
private static char[] initialtable = { 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
't', 't', 'w', 'x', 'y', 'z', };
//得到首拼音码需先在InitializeComponent()函数后,得到GB2312码的首字母区间端点表
public static void Pymtable()
{
//为取得首拼音添加代码
for (int i = 0; i < 26; i++)
{
table[i] = gbValue(chartable[i]);// 得到GB2312码的首字母区间端点表,十进制。
}
table[26] = END;// 区间表结尾
}
public static String GetPym(String SourceStr)
{
String Result = "";
int StrLength = SourceStrLength;
int i;
try
{
for (i = 0; i < StrLength; i++)
{
Result += Char2Initial(SourceStr[i]);
}
}
catch (Exception ex)
{
MessageBoxShow(exToString());
Result = "";
}
return Result;
}
public static char Char2Initial(char ch)
{
// 对英文字母的处理:小写字母转换为大写,大写的直接返回
if (ch >= 'a' && ch <= 'z')
return (char)(ch - 'a' + 'A');
if (ch >= 'A' && ch <= 'Z')
return ch;
// 对非英文字母的处理:转化为首字母,然后判断是否在码表范围内,
// 若不是,则直接返回。
// 若是,则在码表内的进行判断。
int gb = gbValue(ch);// 汉字转换首字母
if ((gb < BEGIN) || (gb > END))// 在码表区间之前,直接返回
return ch;
int i;
for (i = 0; i < 26; i++)
{// 判断匹配码表区间,匹配到就break,判断区间形如“[,)”
if ((gb >= table[i]) && (gb < table[i + 1]))
break;
}
if (gb == END)
{//补上GB2312区间最右端
i = 25;
}
return initialtable[i]; // 在码表区间中,返回首字母
}
/ 取出汉字的编码 cn 汉字/
public static int gbValue(char ch)
{
// 将一个汉字(GB2312)转换为十进制表示。
string str = "";
str += ch;
try
{
gb2312string df = new gb2312string();
df = str;
byte[] bytes = dfToByteArray();
if (bytesLength < 2)
return 0;
return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
}
catch (Exception e)
{
MessageBoxShow(eToString());
return 0;
}
}
#region 是否存在生僻字
/// <summary>
/// 是否存在生僻字
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static bool HasUnfamiliarWord(string value)
{
int start = 0xE000;
int end = 0xAFFE;
string s = "";
s = value;
char[] cs = sToCharArray();
foreach (char item in cs)
{
int i = ConvertToInt32(item);
if (i >= start && i <= end)//unicode 在0xF8F0和0xAFFE之间的为生僻字
{
return true;
}
}
return false;
}
#endregion
以上就是关于C#中如何通过汉字拼音首字母检索筛选数据全部的内容,包括:C#中如何通过汉字拼音首字母检索筛选数据、php中,怎样在文本框里输入字母,然后根据字母在数据库中模糊查询所有首字母为文本框输入的字母的值、按汉语拼音首字母查询数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)