数据库保存为utf-8,页面输入简体字或繁体字,怎么能同时搜索到简繁体呢?

时间:2020-11-30 14:35:32
数据库保存为utf-8,页面输入简体字或繁体字,怎么能同时搜索到简繁体呢?

14 个解决方案

#1


啥意思?

难道不能LIKE 或者 INSTR吗?


直接
SET NAMES UTF8;
然后
SELECT 就可以了

#2


估计LZ的意思是查询一个时,能同时出现简体和繁体2个.

#3


不好意思,没有描述得清楚,就是楼上的意思

发表于:2008-01-11 08:58:132楼 得分:0 
估计LZ的意思是查询一个时,能同时出现简体和繁体2个. 

#4


比如数据库utf-8格式存储了"测试" "測試"


当我只输入简体测试时,要能同时搜索到两个结果

#5


两个字段分别存就可以读了。

#6


感觉有点像百度的搜索
输入繁体字点搜索后自动变成简体的
这个应该是网页的功能
用数据库如何解决


关注

#7


我想你需要一个简繁转换程序

#8


要同时搜索的话,你得有两个库,一个是简体库,另外一个是繁体库。
搜索的时候或者用全文搜索,或者用OR 来搜索。

#9


简繁转换程序

#10


API方法,这是Windows下开发最常用最简单的方法,利用Windows系统自带的API函数,寥寥数行代码即可完成,典型的例子就是 

Windows2000自带的例子,核心代码可以简单列一个 
function GB2312ToBIG5(GB2312Str: string): AnsiString; 
var 
iLen: Integer; 
PGBCHSStr: PChar; //GB编码的简体字符 
PGBCHTStr: PChar; //GB编码的繁体字符 
PUnicodeChar: PWideChar; //Unicode编码的字符 
PBIG5Str: PChar; //BIG5编码的字符 
begin 
PGBCHSStr:=PChar(GB2312Str); 
iLen:=MultiByteToWideChar(936,0,PGBCHSStr,-1,nil,0); //计算转换的字符数 
GetMem(PGBCHTStr,iLen*2+1); //分配内存 
LCMapString($0804,LCMAP_TRADITIONAL_CHINESE,PGBCHSStr,-1,PGBCHTStr,iLen*2); //转换GB码简体到GB码繁体 
GetMem(PUnicodeChar,iLen*2); //分配内存 
MultiByteToWideChar(936,0,PGBCHTStr,-1,PUnicodeChar,iLen); //转换GB码到Unicode码 
iLen:=WideCharToMultiByte(950,0,PUnicodeChar,-1,nil,0,nil,nil); 
GetMem(PBIG5Str,iLen); 
WideCharToMultiByte(950,0,PUnicodeChar,-1,PBIG5Str,iLen,nil,nil); 
Result:=string(PBIG5Str); 
FreeMem(PBIG5Str); 
FreeMem(PUnicodeChar); 
FreeMem(PGBCHTStr); 
end; 
这是Delphi的方式,根据变量定义模式及开发工具不同,代码量会不同,但核心的就那几行 

2、码表法有2种,一种是文件模式,一种是对照码表模式 
文件模式 
如果十年前你接触过软件开发,通过C语言调用UCDOS的字库显示汉字这招应该玩过,那么这个原理是一样的,条件是找一个合适的字库。该 

方法主要利用了gb-big5.tab或big5-gb.tab等码表文件进行,这种方式在网络开发及JAVA开发中用的特别多,核心代码也很简单 
#define TABLE "gb-big5.tab" 

extern void usage(void); 
extern void convert(FILE *fp); 

void main(int argc,char **argv) 

char *source; 
FILE *fp; 
if (argc!=2) usage(); 
source=argv[1]; 
setbuf(stdout,NULL); 
if (access(TABLE,4)!=0) usage(); 
if (source==NULL) usage(); 
if (strlen(source)==0) usage(); 
fp=fopen(source,"r"); 
if (fp==NULL) usage(); 
convert(fp); 
fclose(fp); 
fflush(stdout); 
fclose(stdout); 


void convert(FILE *fp) 

FILE *table; 
int c,x; 
long address; 
table=fopen(TABLE,"r"); 
do { 
c=fgetc(fp); 
if (c>=0xA0) { 
x=fgetc(fp); 
address=((c-0xA0)*510)+(x-1)*2; 
fseek(table,address,SEEK_SET); 
c=fgetc(table); x=fgetc(table); 
if (c!=0&&x!=0) fprintf(stdout,"%c%c",c,x); 
} else 
if (c!=EOF) fputc(c,stdout); 
} while (c!=EOF); 
fclose(table); 


对照码表 
这种方法的原理是,把所有的汉字的内码通过变量或者一定的规则仔细定义好,然后据表查询即可,譬如“国”的简体内码是$B9FA,繁体 

内码是$B0EA,建立一个变脸表,一个存储所有简体汉字,一个存储所有繁体汉字,一一对应,马上就出来了 

3、对照表法 
对照表法应该是最实用最简单的简繁转换方式了,这个方法和对照码表方式差不多,区别在于对照码表法用内码,此方法直接用汉字显示, 

同一个文件或不同文件里面存储简体和繁体的对照表,这个方法的最大好处是照顾行文习惯,这是所有国家化软件必须的方法,譬如 
服务器 - 伺服器 
文件 - 檔案 
..... 
这种方式最大的麻烦是找一个好的对照表,很多公开代码的浏览器包括了这些,Linux下也包括了,当然一些好的对照表可以自己去维护 

4、mlang方法 
这种方法其实就是利用IE的API函数ConvertString,只是要自己定义而已,函数定义为 
HRESULT ConvertString( 
DWORD *pdwMode, 
DWORD dwSrcEncoding, 
DWORD dwDstEncoding, 
BYTE *pSrcStr, 
UINT *pcSrcSize, 
BYTE *pDstStr, 
UINT *pcDstSize 
); 
具体可以去查MSDN 

以上一共介绍了4种方法,细分来总共是5种方法。 

还有一种方法就是利用标准Unicode码表去查,这个码表是MS制作的,也就形成了标准。这个是根据MS的GBK字库制作的 
譬如“國”在简体码表库中的编码是$87F8,那么根据码表查出其Unicode码是$570B,然后根据Unicode码$570B到繁体码表库中查到繁体内码是 

$B0EA,问题就解决了,这个码表库可以到ftp://ftp.unicode.org/Public/MAPPINGS/去下载。936是简体,950是繁体 

当然,还有更多分方法,譬如Access转换法,SQL转换法,但基本原理无外乎以上的几种方法。 

#11


提交时进行转换了,但是速度有影响

#12


http://www.zeali.net/entry/19

#13


个人想到个简单方法,先检测一下字符是简体还是繁体,如果是简体的话,再多转一个变量为繁体出来,反之则一样,然后再进行搜索!

$str="测试";

if ( preg_match("/^(?:\w|[\x80-\xff])$/", $str )){
    $str1=iconv("gbk", "utf-8", $str);
    $str2=iconv("big5", "utf-8", iconv("gbk", "big5", $str));
}else{
    $str1=iconv("big5", "utf-8", $str));
    $str2=iconv("gbk", "utf-8", iconv("big5", "gbk", $str));
}


然后在PHP中的查询语句类似为 select * from DB where name like '%$str1%' or name like '%$str2%'

#14


一次简体搜索,然后转换成繁体搜索,应该就可以了把。

试试下面这个工具包:
http://download.csdn.net/source/727562
一个中文 简体-繁体 互相转换的JAVA工具(*.jar文件)
内存消耗不会超过60K。
1S能转换30W汉字。

内部附有测试用例 和 源代码 , 帮助文档 。

可能对你有用

#1


啥意思?

难道不能LIKE 或者 INSTR吗?


直接
SET NAMES UTF8;
然后
SELECT 就可以了

#2


估计LZ的意思是查询一个时,能同时出现简体和繁体2个.

#3


不好意思,没有描述得清楚,就是楼上的意思

发表于:2008-01-11 08:58:132楼 得分:0 
估计LZ的意思是查询一个时,能同时出现简体和繁体2个. 

#4


比如数据库utf-8格式存储了"测试" "測試"


当我只输入简体测试时,要能同时搜索到两个结果

#5


两个字段分别存就可以读了。

#6


感觉有点像百度的搜索
输入繁体字点搜索后自动变成简体的
这个应该是网页的功能
用数据库如何解决


关注

#7


我想你需要一个简繁转换程序

#8


要同时搜索的话,你得有两个库,一个是简体库,另外一个是繁体库。
搜索的时候或者用全文搜索,或者用OR 来搜索。

#9


简繁转换程序

#10


API方法,这是Windows下开发最常用最简单的方法,利用Windows系统自带的API函数,寥寥数行代码即可完成,典型的例子就是 

Windows2000自带的例子,核心代码可以简单列一个 
function GB2312ToBIG5(GB2312Str: string): AnsiString; 
var 
iLen: Integer; 
PGBCHSStr: PChar; //GB编码的简体字符 
PGBCHTStr: PChar; //GB编码的繁体字符 
PUnicodeChar: PWideChar; //Unicode编码的字符 
PBIG5Str: PChar; //BIG5编码的字符 
begin 
PGBCHSStr:=PChar(GB2312Str); 
iLen:=MultiByteToWideChar(936,0,PGBCHSStr,-1,nil,0); //计算转换的字符数 
GetMem(PGBCHTStr,iLen*2+1); //分配内存 
LCMapString($0804,LCMAP_TRADITIONAL_CHINESE,PGBCHSStr,-1,PGBCHTStr,iLen*2); //转换GB码简体到GB码繁体 
GetMem(PUnicodeChar,iLen*2); //分配内存 
MultiByteToWideChar(936,0,PGBCHTStr,-1,PUnicodeChar,iLen); //转换GB码到Unicode码 
iLen:=WideCharToMultiByte(950,0,PUnicodeChar,-1,nil,0,nil,nil); 
GetMem(PBIG5Str,iLen); 
WideCharToMultiByte(950,0,PUnicodeChar,-1,PBIG5Str,iLen,nil,nil); 
Result:=string(PBIG5Str); 
FreeMem(PBIG5Str); 
FreeMem(PUnicodeChar); 
FreeMem(PGBCHTStr); 
end; 
这是Delphi的方式,根据变量定义模式及开发工具不同,代码量会不同,但核心的就那几行 

2、码表法有2种,一种是文件模式,一种是对照码表模式 
文件模式 
如果十年前你接触过软件开发,通过C语言调用UCDOS的字库显示汉字这招应该玩过,那么这个原理是一样的,条件是找一个合适的字库。该 

方法主要利用了gb-big5.tab或big5-gb.tab等码表文件进行,这种方式在网络开发及JAVA开发中用的特别多,核心代码也很简单 
#define TABLE "gb-big5.tab" 

extern void usage(void); 
extern void convert(FILE *fp); 

void main(int argc,char **argv) 

char *source; 
FILE *fp; 
if (argc!=2) usage(); 
source=argv[1]; 
setbuf(stdout,NULL); 
if (access(TABLE,4)!=0) usage(); 
if (source==NULL) usage(); 
if (strlen(source)==0) usage(); 
fp=fopen(source,"r"); 
if (fp==NULL) usage(); 
convert(fp); 
fclose(fp); 
fflush(stdout); 
fclose(stdout); 


void convert(FILE *fp) 

FILE *table; 
int c,x; 
long address; 
table=fopen(TABLE,"r"); 
do { 
c=fgetc(fp); 
if (c>=0xA0) { 
x=fgetc(fp); 
address=((c-0xA0)*510)+(x-1)*2; 
fseek(table,address,SEEK_SET); 
c=fgetc(table); x=fgetc(table); 
if (c!=0&&x!=0) fprintf(stdout,"%c%c",c,x); 
} else 
if (c!=EOF) fputc(c,stdout); 
} while (c!=EOF); 
fclose(table); 


对照码表 
这种方法的原理是,把所有的汉字的内码通过变量或者一定的规则仔细定义好,然后据表查询即可,譬如“国”的简体内码是$B9FA,繁体 

内码是$B0EA,建立一个变脸表,一个存储所有简体汉字,一个存储所有繁体汉字,一一对应,马上就出来了 

3、对照表法 
对照表法应该是最实用最简单的简繁转换方式了,这个方法和对照码表方式差不多,区别在于对照码表法用内码,此方法直接用汉字显示, 

同一个文件或不同文件里面存储简体和繁体的对照表,这个方法的最大好处是照顾行文习惯,这是所有国家化软件必须的方法,譬如 
服务器 - 伺服器 
文件 - 檔案 
..... 
这种方式最大的麻烦是找一个好的对照表,很多公开代码的浏览器包括了这些,Linux下也包括了,当然一些好的对照表可以自己去维护 

4、mlang方法 
这种方法其实就是利用IE的API函数ConvertString,只是要自己定义而已,函数定义为 
HRESULT ConvertString( 
DWORD *pdwMode, 
DWORD dwSrcEncoding, 
DWORD dwDstEncoding, 
BYTE *pSrcStr, 
UINT *pcSrcSize, 
BYTE *pDstStr, 
UINT *pcDstSize 
); 
具体可以去查MSDN 

以上一共介绍了4种方法,细分来总共是5种方法。 

还有一种方法就是利用标准Unicode码表去查,这个码表是MS制作的,也就形成了标准。这个是根据MS的GBK字库制作的 
譬如“國”在简体码表库中的编码是$87F8,那么根据码表查出其Unicode码是$570B,然后根据Unicode码$570B到繁体码表库中查到繁体内码是 

$B0EA,问题就解决了,这个码表库可以到ftp://ftp.unicode.org/Public/MAPPINGS/去下载。936是简体,950是繁体 

当然,还有更多分方法,譬如Access转换法,SQL转换法,但基本原理无外乎以上的几种方法。 

#11


提交时进行转换了,但是速度有影响

#12


http://www.zeali.net/entry/19

#13


个人想到个简单方法,先检测一下字符是简体还是繁体,如果是简体的话,再多转一个变量为繁体出来,反之则一样,然后再进行搜索!

$str="测试";

if ( preg_match("/^(?:\w|[\x80-\xff])$/", $str )){
    $str1=iconv("gbk", "utf-8", $str);
    $str2=iconv("big5", "utf-8", iconv("gbk", "big5", $str));
}else{
    $str1=iconv("big5", "utf-8", $str));
    $str2=iconv("gbk", "utf-8", iconv("big5", "gbk", $str));
}


然后在PHP中的查询语句类似为 select * from DB where name like '%$str1%' or name like '%$str2%'

#14


一次简体搜索,然后转换成繁体搜索,应该就可以了把。

试试下面这个工具包:
http://download.csdn.net/source/727562
一个中文 简体-繁体 互相转换的JAVA工具(*.jar文件)
内存消耗不会超过60K。
1S能转换30W汉字。

内部附有测试用例 和 源代码 , 帮助文档 。

可能对你有用