Chủ Nhật, 3 tháng 8, 2008

Thuật toán chuyển đổi xâu ký tự từ TCVN3

Trong nhiều trường hợp cần phải chuyển đổi mã từ TCVN 3 sang Unicode, ví dụ như khi import dữ liệu từ các chương trình cũ. 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 với độ phức tạp cỡ O(n). Ý 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. Thuật toán được cài đặt bằng ngôn ngữ C#.
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);
}}

Không có nhận xét nào: