Một số phương pháp chuyển đổi chuỗi có dấu thành không dấu trong URL Rewrite
Tôi đã xem qua nhiều bài viết và nhận thấy nhiều bạn hỏi rằng: Sau khi đã biết cách Rewrite URL, làm thế nào để chuyển từ /1/Category/index.html thành /1/Thoi-trang.html?
Thực tế thì đây chỉ là một thủ thuật nhỏ.
Hãy tiếp tục với ví dụ URL: http://lichsu.vn/1/Thoi-trang.html.
Trong cơ sở dữ liệu của chúng ta, sẽ có một bảng Categories với các cột ID và CatName, chứa giá trị ID = 1 và CatName = Thời trang.
Nhiệm vụ của bạn là viết một hàm để chuyển chuỗi ‘Thời trang’ thành ‘Thoi-trang’. Nguyên tắc là: Giữ nguyên các ký tự không dấu, thay thế ký tự có dấu bằng ký tự không dấu tương ứng, ví dụ như ‘ờ’ thành ‘o’. Các ký tự đặc biệt như dấu cách, dấu ngoặc kép, hoặc dấu ngoặc đơn sẽ được thay thế bằng dấu ‘-’.
Có nhiều cách để thực hiện điều này, bao gồm viết Code C# hoặc xử lý bằng các hàm (Function) ngay trong cơ sở dữ liệu (Database).
Dưới đây là hàm tôi viết bằng C# (kết hợp từ nhiều phương pháp khác nhau), tôi gọi nó là ConvertToUnSign:
///
/// Hàm chuyển đổi chuỗi có dấu thành không dấu
/// NhanDT 14/01/2011.
///
///
///
public static string ConvertToUnSign(string text)
{
for (int i = 32; i < 48; i++)
{
text = text.Replace(((char)i).ToString(), " ");
}
text = text.Replace(".", "-");
text = text.Replace(" ", "-");
text = text.Replace(",", "-");
text = text.Replace(";", "-");
text = text.Replace(":", "-");
Regex regex = new Regex(@"p{IsCombiningDiacriticalMarks}+");
string strFormD = text.Normalize(System.Text.NormalizationForm.FormD);
return regex.Replace(strFormD, String.Empty).Replace('u0111','d').Replace('u0110', 'D');
}
Nếu muốn xử lý trong Database, tôi có sưu tầm được một Function của Admin trong HMWeb.com.vn
CREATE FUNCTION [dbo].[fuChuyenCoDauThanhKhongDau]
(
@strInput NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
IF @strInput IS NULL RETURN @strInput
IF @strInput = '' RETURN @strInput
DECLARE @RT NVARCHAR(4000)
DECLARE @SIGN_CHARS NCHAR(136)
DECLARE @UNSIGN_CHARS NCHAR (136)
SET @SIGN_CHARS = N'ăâđêôơưàảãạáằẳẵặắầẩẫậấèẻẽẹéềểễệế
ìỉĩịíòỏõọóồổỗộốờởỡợớùủũụúừửữựứỳỷỹỵý
ĂÂĐÊÔƠƯÀẢÃẠÁẰẲẴẶẮẦẨẪẬẤÈẺẼẸÉỀỂỄỆẾÌỈĨỊÍ
ÒỎÕỌÓỒỔỖỘỐỜỞỠỢỚÙỦŨỤÚỪỬỮỰỨỲỶỸỴÝ'
+NCHAR(272)+ NCHAR(208)
SET @UNSIGN_CHARS = N'aadeoouaaaaaaaaaaaaaaaeeeeeeeeee
iiiiiooooooooooooooouuuuuuuuuuyyyyy
AADEOOUAAAAAAAAAAAAAAAEEEEEEEEEEIIIII
OOOOOOOOOOOOOOOUUUUUUUUUUYYYYYDD'
DECLARE @COUNTER int
DECLARE @COUNTER1 int
SET @COUNTER = 1
WHILE (@COUNTER <=LEN(@strInput))
BEGIN
SET @COUNTER1 = 1
--Tìm trong chuỗi mẫu
WHILE (@COUNTER1 <=LEN(@SIGN_CHARS)+1)
BEGIN
IF UNICODE(SUBSTRING(@SIGN_CHARS, @COUNTER1,1))
= UNICODE(SUBSTRING(@strInput,@COUNTER ,1) )
BEGIN
IF @COUNTER=1
SET @strInput = SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)
+ SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)-1)
ELSE
SET @strInput = SUBSTRING(@strInput, 1, @COUNTER-1)
+SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)
+ SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)- @COUNTER)
BREAK
END
SET @COUNTER1 = @COUNTER1 +1
END
--Tìm tiếp
SET @COUNTER = @COUNTER +1
END
SET @strInput = replace(@strInput,' ','-')
RETURN @strInput
END
Cách sử dụng hàm Convert khi cần thiết:
Bạn có thể gọi hàm chuyển đổi trong SQL như sau:
SELECT dbo.fuChuyenCoDauThanhKhongDau (CatName) FROM Categories
Với giá trị CatName = 'Thời trang', chúng ta sẽ nhận được kết quả là 'thoi-trang'.
Như vậy, đến bước này, chúng ta đã nắm rõ cách chuyển đổi chuỗi có dấu thành chuỗi không dấu. Khi sử dụng chuỗi đã được chuyển đổi này và truyền vào các Parameter trong Rule, chúng ta sẽ tạo ra các liên kết thân thiện với người dùng hơn rất nhiều so với các Query chỉ chứa các ID là các chữ số khó hiểu.