Convert TCVN3 to Unicode - Chuyển đổi xâu ký tự từ TCVN3 sang Unicode

Trong nhiều trường hợp cần phải chuyển đổi mã từ TCVN 3 sang Unicode. Bài này giới thiệu một thuật toán đơn giản cho phép chuyển đổi một xâu ký tự từ TCVN 3 sang Unicode.
Ý tưởng của thuật toán là xây dựng hai mảng chứa các ký tự tiếng Việt có dấu cho mã TCVN 3 và Unicode. Để không phải tìm kiếm mỗi khi gặp ký tự có dấu, cần xây dựng một mảng trung gian để chuyển đổi, điều này làm giảm đáng kể thời gian chuyển đổi.
1. Hàm Csharp

using System;
using System.Collections.Generic;
using System.Text;

class Converter {
    private static char[] tcvnchars = {
        ‘µ’, ‘¸’, ‘¶’, ‘·’, ‘¹’, 
        ‘¨’, ‘»’, ‘¾’, ‘¼’, ‘½’, ‘Æ’, 
        ‘©’, ‘Ç’, ‘Ê’, ‘È’, ‘É’, ‘Ë’, 
        ‘®’, ‘Ì’, ‘Ð’, ‘Î’, ‘Ï’, ‘Ñ’, 
        ‘ª’, ‘Ò’, ‘Õ’, ‘Ó’, ‘Ô’, ‘Ö’, 
        ‘×’, ‘Ý’, ‘Ø’, ‘Ü’, ‘Þ’, 
        ‘ß’, ‘ã’, ‘á’, ‘â’, ‘ä’, 
        ‘«’, ‘å’, ‘è’, ‘æ’, ‘ç’, ‘é’, 
        ‘¬’, ‘ê’, ‘í’, ‘ë’, ‘ì’, ‘î’, 
        ‘ï’, ‘ó’, ‘ñ’, ‘ò’, ‘ô’, 
        ‘­’, ‘õ’, ‘ø’, ‘ö’, ‘÷’, ‘ù’, 
        ‘ú’, ‘ý’, ‘û’, ‘ü’, ‘þ’, 
        ‘¡’, ‘¢’, ‘§’, ‘£’, ‘¤’, ‘¥’, ‘¦’
    };

    private static char[] unichars = {
        ‘à’, ‘á’, ‘ả’, ‘ã’, ‘ạ’, 
        ‘ă’, ‘ằ’, ‘ắ’, ‘ẳ’, ‘ẵ’, ‘ặ’, 
        ‘â’, ‘ầ’, ‘ấ’, ‘ẩ’, ‘ẫ’, ‘ậ’, 
        ‘đ’, ‘è’, ‘é’, ‘ẻ’, ‘ẽ’, ‘ẹ’, 
        ‘ê’, ‘ề’, ‘ế’, ‘ể’, ‘ễ’, ‘ệ’, 
        ‘ì’, ‘í’, ‘ỉ’, ‘ĩ’, ‘ị’, 
        ‘ò’, ‘ó’, ‘ỏ’, ‘õ’, ‘ọ’, 
        ‘ô’, ‘ồ’, ‘ố’, ‘ổ’, ‘ỗ’, ‘ộ’, 
        ‘ơ’, ‘ờ’, ‘ớ’, ‘ở’, ‘ỡ’, ‘ợ’, 
        ‘ù’, ‘ú’, ‘ủ’, ‘ũ’, ‘ụ’, 
        ‘ư’, ‘ừ’, ‘ứ’, ‘ử’, ‘ữ’, ‘ự’, 
        ‘ỳ’, ‘ý’, ‘ỷ’, ‘ỹ’, ‘ỵ’, 
        ‘Ă’, ‘Â’, ‘Đ’, ‘Ê’, ‘Ô’, ‘Ơ’, ‘Ư’
    };

    private static char[] convertTable;

    static Converter() {
        convertTable = new char[256];
        for (int i = 0; i < 256; i++)
            convertTable[i] = (char)i;
        for (int i = 0; i < tcvnchars.Length; i++)
            convertTable[tcvnchars[i]] = unichars[i];
    }

    public static string TCVN3ToUnicode(string value) {
        char[] chars = value.ToCharArray();
        for (int i = 0; i < chars.Length; i++)
            if (chars[i] < (char)256)
                chars[i] = convertTable[chars[i]];
        return new string(chars);
    }
}

2. Hàm trong SQL:
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