純T-SQL腳本可以實現簡繁體轉換嗎?歡迎指教。

时间:2022-05-01 07:01:43
看了chiff的帖子,覺得有點思路,但又覺得無從下手。(http://expert.csdn.net/Expert/topic/1297/1297154.xml?temp=.5905268)
用Unicode好像不能解決問題。

between 19968 and 40870 之間包含了簡體及繁體的字的所有Unicode碼,但是毫無規則(或許是我還沒找到)。


34 个解决方案

#1


纯sql脚本可能不行吧,要找到两边汉字的对照表

#2


有规律就好办,按规律转换;
没有规律就要建立一个对照表,利用表进行转换。
找规律。。。

#3


SQL支持UNICODE字符集,应该可以啊。找个繁体输入法试试

#4


关注,作成后应该很有用

#5


up

#6


我踢我踢我踢踢踢!

#7


关注

#8


学习

#9


我踢我踢我踢踢踢!

#10


没法。要有对照表。
GBK是在19968 and 40870之间,因为它们字数不一样。且如果转BIG5又更难了

#11


帮飘香兄踢一脚

#12


chiff的帖子好象看不了啊

#13


我再踢!
*,給個點子吧。

#14


按鈕JJ,奇怪哦,我昨天還打得開的。
暈了,搜索都搜不到了。

#15


简繁转换,你如果不是转成BIG5,单在GBK内转,在SQLSERVER内对照表也好做些。可是他们汉字不一一对应。简多繁少。UNICODE汉字分区后面没一点规律。

不理彩简繁之间词汇不一致问题。建对照表:
GBK简--GBK繁--BIG5简--BIG5繁
这样好转些。



#16


网上有简繁GBK BIG5对照文本,可以搜索下载一个。倒入SQLSERVER中。

#17


谁有对照文本吗?共享一下,有空我来做个对照表

#18


学习

#19


学习!学习!

#20


http://it.beelink.com.cn/20020802/1173882.shtml

下载了
繁简两用五笔输入法 V5.0 

解压后,用输入法生成器逆转换Vcd2000.mb和Dcd2000.md,

得到两个文本文件,如:
Vcd2000.mb
[Text]
工a
式aa
工aaaa a
恭恭敬敬aaaa
工期aaad
某某某aaaf
葡萄牙aaah
....

Dcd2000.md
[Text]
工a
式aa
工aaaa a
恭恭敬敬aaaa
工期aaad
某某某aaaf
葡萄牙aaah
花花世界aaal
工藝aaan
工區aaaq
工匠aaar
....
看以上文件,顺序完全一样,所以可以达到对照目的.

将这两个文档导入数据中处理,即可得到繁简对照表,

#21


上面方法不行,排列不同.

#22


我想了想,还有一个对照表也少不了,那就常用词汇对照表,简单转换后必需通过修正,
比如,我举个简单例子:简体字“后”
简体    繁体
后汉书--後漢書  不能是:后漢書
皇后----皇后  而不能是:皇後

这种非一一对应的例子不计其数!所以简繁转换是个难题。不然就不用那么多专业软件了。
转换得好速度必然慢。转换得快效果未必会好。
要想做好简繁转换,速度上要下一翻功夫。

更不说后来新词汇,如:“字节”--“位元组” 等等了。
以上仅供参考。

#23


暈了暈了,,,,,,看來此路不通。
我打算用sp_OACreate去Call Word里面的繁轉簡功能了。
腳本寫出來後我會放出來給上面關注這個問題的朋友一起分享。
謝謝各位。



#24


我觉得有一个办法可以考虑,word 2000及以上版本中本来就有简繁体字转换的工具,而且可以达到J9988说的那种效果。
所以我觉得可以用OLE Automation,将要转换的文本内容复制到一个空白WORD文档中,调用转换的语句:
简转繁:
  WordBasic.ToolsSCTCTranslate Direction:=0, Varients:=0, TranslateCommon:=0

繁转简:
  WordBasic.ToolsTCSCTranslate Direction:=0, Varients:=0, TranslateCommon:=0

再将转换后的文本COPY出来就可以了。

这样肯定是可以达到要求的,就是速度可能会稍有些慢。可以在程序中最开始就定义一WORD APPLICATION的实例对象,不必每转一次就申明一次,这样可能会快些。

有些情况可能会觉得这样比较麻烦,所以你自己考虑吧。

我是觉得自己写简繁转换,未必效率会高到哪里去,不如用现成的。

#25


天哪,我刚回复,你就已经是想到跟我一样的想法了:)

#26


有理有理,借用人家现成的。

不过有人家现成的C代码,写成XP然后调用。应付SQLSERVER内简单转换应是不错的。
也可以参考算法:
http://www.5xsoft.com/data/200108/3108144301_1.htm

我相信没有100%准确的转换软件,只有在准确率和速度上做出取舍。

#27


正确显示数据库里同时存在的GB码和BIG5码:

Public Function CheckBIG(strSource As String) As Boolean
Dim idx As Long
Dim ByteTemp() As Byte
CheckBIG = False
For idx = 1 To Len(strSource)
ByteTemp = StrConv(Mid(strSource, idx, 1), vbFromUnicode)
If UBound(ByteTemp) > 0 Then
If (ByteTemp(1) >= 64) And (ByteTemp(1) <= 126) Then
CheckBIG = True
Exit For
End If
End If
Next idx
End Function

#28


/*
 

Description:
---需要安裝Office 2000

統杅佽隴:
-------------------------------------------------------
@TransType 轉換類型
0 -- 簡體轉繁體
1 -- 繁體轉簡體
@sInText 待轉換的字串
@sOutText 轉換後的字串
-------------------------------------------------------
*/


ALTER  Proc spConverter @TransType tinyint,@sInText Nvarchar(4000),@sOutText Nvarchar(4000)OUTPUT 
AS

DECLARE @WordApplication int
DECLARE @ErrHandler int
DECLARE @Document int
DECLARE @Selection int
DECLARE @Message NVARCHAR(4000)
DECLARE @src varchar(255), @desc varchar(255)
--Create Word instance 
EXEC @ErrHandler = sp_OACreate 'Word.Application', @WordApplication OUT
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @WordApplication, @src OUT, @desc OUT 
   SELECT hr=convert(varbinary(4),@ErrHandler), Source=@src, Description=@desc
    RETURN
END
---// create instance end
--Create a word document instance
EXEC @ErrHandler = sp_OACreate 'Word.Document', @Document OUT
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Document, @src OUT, @desc OUT 
   SELECT hr=convert(varbinary(4),@ErrHandler), Source=@src, Description=@desc
    RETURN
END
--// 
--- 
EXEC @ErrHandler = sp_OAGetProperty @Document, 'Application.Selection', @Selection OUT
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Document
    RETURN
END

EXEC @ErrHandler = sp_OASetProperty @Selection, 'Text', @sInText
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Selection
    RETURN
END

EXEC @ErrHandler = sp_OAMethod @Selection, 'Range.TCSCConverter',NULL,@TransType,1,1
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Selection
    RETURN
END

EXEC @ErrHandler = sp_OAGetProperty @Selection, 'Text', @sOutText OUT
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Selection
    RETURN
END
---
EXEC @ErrHandler = sp_OADestroy @WordApplication
IF @Errhandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @WordApplication
    RETURN
END
---
EXEC @ErrHandler = sp_OADestroy @Document
IF @Errhandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Document
    RETURN
END
EXEC sp_OAStop
RETURN

#29


UP一下,保存.謝謝哦.

#30


学习学习再学习!~

#31


好极~

#32


xuexi

#33


精华

#34


我都发给你好多天了,你今天才看,叹"精华"!

#1


纯sql脚本可能不行吧,要找到两边汉字的对照表

#2


有规律就好办,按规律转换;
没有规律就要建立一个对照表,利用表进行转换。
找规律。。。

#3


SQL支持UNICODE字符集,应该可以啊。找个繁体输入法试试

#4


关注,作成后应该很有用

#5


up

#6


我踢我踢我踢踢踢!

#7


关注

#8


学习

#9


我踢我踢我踢踢踢!

#10


没法。要有对照表。
GBK是在19968 and 40870之间,因为它们字数不一样。且如果转BIG5又更难了

#11


帮飘香兄踢一脚

#12


chiff的帖子好象看不了啊

#13


我再踢!
*,給個點子吧。

#14


按鈕JJ,奇怪哦,我昨天還打得開的。
暈了,搜索都搜不到了。

#15


简繁转换,你如果不是转成BIG5,单在GBK内转,在SQLSERVER内对照表也好做些。可是他们汉字不一一对应。简多繁少。UNICODE汉字分区后面没一点规律。

不理彩简繁之间词汇不一致问题。建对照表:
GBK简--GBK繁--BIG5简--BIG5繁
这样好转些。



#16


网上有简繁GBK BIG5对照文本,可以搜索下载一个。倒入SQLSERVER中。

#17


谁有对照文本吗?共享一下,有空我来做个对照表

#18


学习

#19


学习!学习!

#20


http://it.beelink.com.cn/20020802/1173882.shtml

下载了
繁简两用五笔输入法 V5.0 

解压后,用输入法生成器逆转换Vcd2000.mb和Dcd2000.md,

得到两个文本文件,如:
Vcd2000.mb
[Text]
工a
式aa
工aaaa a
恭恭敬敬aaaa
工期aaad
某某某aaaf
葡萄牙aaah
....

Dcd2000.md
[Text]
工a
式aa
工aaaa a
恭恭敬敬aaaa
工期aaad
某某某aaaf
葡萄牙aaah
花花世界aaal
工藝aaan
工區aaaq
工匠aaar
....
看以上文件,顺序完全一样,所以可以达到对照目的.

将这两个文档导入数据中处理,即可得到繁简对照表,

#21


上面方法不行,排列不同.

#22


我想了想,还有一个对照表也少不了,那就常用词汇对照表,简单转换后必需通过修正,
比如,我举个简单例子:简体字“后”
简体    繁体
后汉书--後漢書  不能是:后漢書
皇后----皇后  而不能是:皇後

这种非一一对应的例子不计其数!所以简繁转换是个难题。不然就不用那么多专业软件了。
转换得好速度必然慢。转换得快效果未必会好。
要想做好简繁转换,速度上要下一翻功夫。

更不说后来新词汇,如:“字节”--“位元组” 等等了。
以上仅供参考。

#23


暈了暈了,,,,,,看來此路不通。
我打算用sp_OACreate去Call Word里面的繁轉簡功能了。
腳本寫出來後我會放出來給上面關注這個問題的朋友一起分享。
謝謝各位。



#24


我觉得有一个办法可以考虑,word 2000及以上版本中本来就有简繁体字转换的工具,而且可以达到J9988说的那种效果。
所以我觉得可以用OLE Automation,将要转换的文本内容复制到一个空白WORD文档中,调用转换的语句:
简转繁:
  WordBasic.ToolsSCTCTranslate Direction:=0, Varients:=0, TranslateCommon:=0

繁转简:
  WordBasic.ToolsTCSCTranslate Direction:=0, Varients:=0, TranslateCommon:=0

再将转换后的文本COPY出来就可以了。

这样肯定是可以达到要求的,就是速度可能会稍有些慢。可以在程序中最开始就定义一WORD APPLICATION的实例对象,不必每转一次就申明一次,这样可能会快些。

有些情况可能会觉得这样比较麻烦,所以你自己考虑吧。

我是觉得自己写简繁转换,未必效率会高到哪里去,不如用现成的。

#25


天哪,我刚回复,你就已经是想到跟我一样的想法了:)

#26


有理有理,借用人家现成的。

不过有人家现成的C代码,写成XP然后调用。应付SQLSERVER内简单转换应是不错的。
也可以参考算法:
http://www.5xsoft.com/data/200108/3108144301_1.htm

我相信没有100%准确的转换软件,只有在准确率和速度上做出取舍。

#27


正确显示数据库里同时存在的GB码和BIG5码:

Public Function CheckBIG(strSource As String) As Boolean
Dim idx As Long
Dim ByteTemp() As Byte
CheckBIG = False
For idx = 1 To Len(strSource)
ByteTemp = StrConv(Mid(strSource, idx, 1), vbFromUnicode)
If UBound(ByteTemp) > 0 Then
If (ByteTemp(1) >= 64) And (ByteTemp(1) <= 126) Then
CheckBIG = True
Exit For
End If
End If
Next idx
End Function

#28


/*
 

Description:
---需要安裝Office 2000

統杅佽隴:
-------------------------------------------------------
@TransType 轉換類型
0 -- 簡體轉繁體
1 -- 繁體轉簡體
@sInText 待轉換的字串
@sOutText 轉換後的字串
-------------------------------------------------------
*/


ALTER  Proc spConverter @TransType tinyint,@sInText Nvarchar(4000),@sOutText Nvarchar(4000)OUTPUT 
AS

DECLARE @WordApplication int
DECLARE @ErrHandler int
DECLARE @Document int
DECLARE @Selection int
DECLARE @Message NVARCHAR(4000)
DECLARE @src varchar(255), @desc varchar(255)
--Create Word instance 
EXEC @ErrHandler = sp_OACreate 'Word.Application', @WordApplication OUT
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @WordApplication, @src OUT, @desc OUT 
   SELECT hr=convert(varbinary(4),@ErrHandler), Source=@src, Description=@desc
    RETURN
END
---// create instance end
--Create a word document instance
EXEC @ErrHandler = sp_OACreate 'Word.Document', @Document OUT
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Document, @src OUT, @desc OUT 
   SELECT hr=convert(varbinary(4),@ErrHandler), Source=@src, Description=@desc
    RETURN
END
--// 
--- 
EXEC @ErrHandler = sp_OAGetProperty @Document, 'Application.Selection', @Selection OUT
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Document
    RETURN
END

EXEC @ErrHandler = sp_OASetProperty @Selection, 'Text', @sInText
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Selection
    RETURN
END

EXEC @ErrHandler = sp_OAMethod @Selection, 'Range.TCSCConverter',NULL,@TransType,1,1
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Selection
    RETURN
END

EXEC @ErrHandler = sp_OAGetProperty @Selection, 'Text', @sOutText OUT
IF @ErrHandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Selection
    RETURN
END
---
EXEC @ErrHandler = sp_OADestroy @WordApplication
IF @Errhandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @WordApplication
    RETURN
END
---
EXEC @ErrHandler = sp_OADestroy @Document
IF @Errhandler != 0
BEGIN
   EXEC sp_OAGetErrorInfo @Document
    RETURN
END
EXEC sp_OAStop
RETURN

#29


UP一下,保存.謝謝哦.

#30


学习学习再学习!~

#31


好极~

#32


xuexi

#33


精华

#34


我都发给你好多天了,你今天才看,叹"精华"!