哪些字符是有全角和半角之分的搔预?
首先霹期,中文是只有全角,沒有半角之分拯田,所以轉(zhuǎn)換的時(shí)候可以忽略掉中文字符历造。
- 英文字符與標(biāo)點(diǎn)
對(duì)于英文字符來說,同字符半角的和全角的編碼差值總是65248
。
select UNICODE('a'),UNICODE('a'),UNICODE('a')-UNICODE('a')
(無列名)|(無列名)|(無列名)|
---|----|----
97| 265345| 65248
在ASCII碼中吭产,英文字符與標(biāo)點(diǎn)的編碼范圍為33~126侣监,用SQL 通配符表示為:[!-~]
,當(dāng)然臣淤,全角字符的編碼是超出ASCII編碼范圍的橄霉,只需在半角的ASCII的編碼基礎(chǔ)加上差值65248
就能得到全角的UNICODE編碼。
- 空格
空格這個(gè)表特殊邑蒋,全角為12288(0x3000)
姓蜂,半角為32(0x20)
需要特殊處理下
了解了半角和全角的關(guān)系之后可以寫個(gè)函數(shù)來相互轉(zhuǎn)換
CREATE FUNCTION f_Convert(
@str NVARCHAR(4000), --要轉(zhuǎn)換的字符串
@flag BIT --轉(zhuǎn)換標(biāo)志,0轉(zhuǎn)換成半角,1轉(zhuǎn)換成全角
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE
@pat NVARCHAR(8),
@step INT,
@i INT,
@spc INT
IF @flag = 0
SELECT
@pat = N'%[!-~]%', --全角的通配符
@step = -65248,
@str = REPLACE(@str, N' ', N' ')
ELSE
SELECT
@pat = N'%[!-~]%', --半角的通配符
@step = 65248,
@str = REPLACE(@str, N' ', N' ')
--指定排序規(guī)則
SET @i = PATINDEX(@pat collate LATIN1_GENERAL_BIN, @str)
WHILE @i > 0
SELECT
@str = REPLACE(@str,
SUBSTRING(@str, @i, 1),
NCHAR(UNICODE(SUBSTRING(@str, @i, 1)) + @step)),
@i = PATINDEX(@pat collate LATIN1_GENERAL_BIN, @str)
RETURN (@str)
END