Pages

Chủ Nhật, 1 tháng 2, 2015

Convert Font từ TCVN3 sang Unicode

Vấn đề chuyển đổi font chữ trong SQL đã được nhắc đến nhiều, và nếu bạn là lập trình viên và đã làm nhiều dự án chắc là bạn đã từng gặp vấn đề này: Chuyển font từ TCVN3 sang Unicode.

Tôi xin giới thiệu các bạn hàm convert sau:
CREATE FUNCTION dbo.funConvertToUnicode
 (@strInput VARCHAR(4000)  )
RETURNS NVARCHAR(4000) AS  
BEGIN 
 DECLARE @strOutput NVARCHAR(4000)
 DECLARE @TCVN CHAR(671)
 DECLARE @UNICODE CHAR(671)
 SET @TCVN = 
 ',184, 181, 182, 183, 185, 168, 190, 187, 188, 189, 198,
  169, 202, 199, 200, 201, 203, 208, 204, 206, 207, 209, 
  170, 213, 210, 211, 212, 214, 221, 215, 216, 220, 222,
  227, 223, 225, 226, 228, 171, 232, 229, 230, 231, 233, 
  172, 237, 234, 235, 236, 238, 243, 239, 241, 242, 244, 
  173, 248, 245, 246, 247, 249, 253, 250, 251, 252, 254, 
  174, 184, 181, 182, 183, 185, 161, 190, 187, 188, 189, 198, 
  162, 202, 199, 200, 201, 203, 208, 204, 206, 207, 209, 163, 
  213, 210, 211, 212, 214, 221, 215, 216, 220, 222, 227, 223, 
  225, 226, 228, 164, 232, 229, 230, 231, 233, 165, 237, 234, 
  235, 236, 238, 243, 239, 241, 242, 244, 166, 248, 245, 246, 
  247, 249, 253, 250, 251, 252, 254, 167, '

 SET @UNICODE = 
 ',225, 224, 7843,227, 7841,259, 7855,7857,7859,7861,7863,
 226, 7845,7847,7849,7851,7853,233, 232, 7867,7869,7865,234, 
 7871,7873,7875,7877,7879,237, 236, 7881,297, 7883,243, 242, 
 7887,245, 7885,244, 7889,7891,7893,7895,7897,417, 7899,7901,
 7903,7905,7907,250, 249, 7911,361, 7909,432, 7913,7915,7917,
 7919,7921,253, 7923,7927,7929,7925,273, 193, 192, 7842,195, 
 7840,258, 7854,7856,7858,7860,7862,194, 7844,7846,7848,7850,
 7852,201, 200, 7866,7868,7864,202, 7870,7872,7874,7876,7878,
 205, 204, 7880,296, 7882,211, 210, 7886,213, 7884,212, 7888,
 7890,7892,7894,7896,416, 7898,7900,7902,7904,7906,218, 217, 
 7910,360, 7908,431, 7912,7914,7916,7918,7920,221, 7922,
 7926,7928,7924,272, '

 IF @strInput IS NULL RETURN ''
 IF @strInput = '' RETURN ''
 DECLARE @COUNTER INT
 DECLARE @POSITION INT
 SET @COUNTER = 1
 SET @strOutput = ''
 WHILE (@COUNTER <= LEN(@strInput))
 BEGIN
 SET @POSITION = CHARINDEX(','+CONVERT(CHAR(4),
  ASCII(SUBSTRING(@strInput, @COUNTER, 1)))+',', @TCVN, 1)
 IF @POSITION > 0
 SET @strOutput = @strOutput + 
  NCHAR(CONVERT(INT,SUBSTRING(@UNICODE, @POSITION+1, 4)))
 ELSE
 SET @strOutput = @strOutput + SUBSTRING(@strInput, @COUNTER, 1)
 SET @COUNTER = @COUNTER + 1
 END
 RETURN @strOutput 
END
Chú ý để hàm chạy đúng bạn cần để
SET @TCVN = ',184, 181, 182,...'


SET @UNICODE = ',225, 224, 7843,...'

Mỗi biến trên cùng 1 dòng code. Ở đây mình không trình bày được như vậy vì nếu để trên cùng dòng sẽ quá độ rộng của trình duyệt

Để chạy thử hàm trên bạn mở notepad, chọn font (Unikey) là TCVN3 và gõ vào chuỗi bất kỳ.

Vì dụ:
SELECT [dbo].[fuConvertToUnicode] ('Céng hßa x· héi chñ nghÜa ViÖt Nam')
 --> Cộng hòa xã hội chủ nghĩa Việt Nam