Browsing "Programming"
Jun 14, 2012 -

Thử một bài viết có rất nhiều tiếng Việt

Bài viết này lẽ ra đã không được publish. Mục đích của mình chỉ là kiểm tra xem WordPress 3.4 xử lý tiếng Việt trong Permalink như thế nào. Trước 3.4, WordPress xử lý việc này không tốt, cụ thể là với tiêu đề như trên, WordPress sẽ xử lý thành “thử-một-bai-viết-co-rất-nhiều-tiếng-việt”. WordPress 3.4 đã xử lý việc này rất tốt, URL trở thành “thu-mot-bai-viet-co-rat-nhieu-tieng-viet”.

Dưới đây là đoạn code được mình viết và đặt trong file wp-includes/formatting.php để xử lý tiếng Việt trong Permalink. WordPress 3.4 cũng có một đoạn xử lý tương tự nhưng đã tối ưu và loại bỏ các ký tự trùng với các phần sẵn có trong WordPress.

// Decompositions for Vietnamese
chr(65) => 'A',chr(97) => 'a',
chr(196).chr(130) => 'A',chr(196).chr(131) => 'a',
chr(195).chr(130) => 'A',chr(195).chr(162) => 'a',
chr(195).chr(128) => 'A',chr(195).chr(160) => 'a',
chr(225).chr(186).chr(176) => 'A',chr(225).chr(186).chr(177) => 'a',
chr(225).chr(186).chr(166) => 'A',chr(225).chr(186).chr(167) => 'a',
chr(195).chr(129) => 'A',chr(195).chr(161) => 'a',
chr(225).chr(186).chr(174) => 'A',chr(225).chr(186).chr(175) => 'a',
chr(225).chr(186).chr(164) => 'A',chr(225).chr(186).chr(165) => 'a',
chr(225).chr(186).chr(162) => 'A',chr(225).chr(186).chr(163) => 'a',
chr(225).chr(186).chr(178) => 'A',chr(225).chr(186).chr(179) => 'a',
chr(225).chr(186).chr(168) => 'A',chr(225).chr(186).chr(169) => 'a',
chr(195).chr(131) => 'A',chr(195).chr(163) => 'a',
chr(225).chr(186).chr(180) => 'A',chr(225).chr(186).chr(181) => 'a',
chr(225).chr(186).chr(170) => 'A',chr(225).chr(186).chr(171) => 'a',
chr(225).chr(186).chr(160) => 'A',chr(225).chr(186).chr(161) => 'a',
chr(225).chr(186).chr(182) => 'A',chr(225).chr(186).chr(183) => 'a',
chr(225).chr(186).chr(172) => 'A',chr(225).chr(186).chr(173) => 'a',
chr(69) => 'E',chr(101) => 'e',
chr(195).chr(138) => 'E',chr(195).chr(170) => 'e',
chr(195).chr(136) => 'E',chr(195).chr(168) => 'e',
chr(225).chr(187).chr(128) => 'E',chr(225).chr(187).chr(129) => 'e',
chr(195).chr(137) => 'E',chr(195).chr(169) => 'e',
chr(225).chr(186).chr(190) => 'E',chr(225).chr(186).chr(191) => 'e',
chr(225).chr(186).chr(186) => 'E',chr(225).chr(186).chr(187) => 'e',
chr(225).chr(187).chr(130) => 'E',chr(225).chr(187).chr(131) => 'e',
chr(225).chr(186).chr(188) => 'E',chr(225).chr(186).chr(189) => 'e',
chr(225).chr(187).chr(132) => 'E',chr(225).chr(187).chr(133) => 'e',
chr(225).chr(186).chr(184) => 'E',chr(225).chr(186).chr(185) => 'e',
chr(225).chr(187).chr(134) => 'E',chr(225).chr(187).chr(135) => 'e',
chr(73) => 'I',chr(105) => 'i',
chr(195).chr(140) => 'I',chr(195).chr(172) => 'i',
chr(195).chr(141) => 'I',chr(195).chr(173) => 'i',
chr(225).chr(187).chr(136) => 'I',chr(225).chr(187).chr(137) => 'i',
chr(225).chr(187).chr(138) => 'I',chr(225).chr(187).chr(139) => 'i',
chr(79) => 'O',chr(111) => 'o',
chr(195).chr(148) => 'O',chr(195).chr(180) => 'o',
chr(198).chr(160) => 'O',chr(198).chr(161) => 'o',
chr(195).chr(146) => 'O',chr(195).chr(178) => 'o',
chr(225).chr(187).chr(146) => 'O',chr(225).chr(187).chr(147) => 'o',
chr(225).chr(187).chr(156) => 'O',chr(225).chr(187).chr(157) => 'o',
chr(195).chr(147) => 'O',chr(195).chr(179) => 'o',
chr(225).chr(187).chr(144) => 'O',chr(225).chr(187).chr(145) => 'o',
chr(225).chr(187).chr(154) => 'O',chr(225).chr(187).chr(155) => 'o',
chr(225).chr(187).chr(142) => 'O',chr(225).chr(187).chr(143) => 'o',
chr(225).chr(187).chr(148) => 'O',chr(225).chr(187).chr(149) => 'o',
chr(225).chr(187).chr(158) => 'O',chr(225).chr(187).chr(159) => 'o',
chr(195).chr(149) => 'O',chr(195).chr(181) => 'o',
chr(225).chr(187).chr(150) => 'O',chr(225).chr(187).chr(151) => 'o',
chr(225).chr(187).chr(160) => 'O',chr(225).chr(187).chr(161) => 'o',
chr(225).chr(187).chr(140) => 'O',chr(225).chr(187).chr(141) => 'o',
chr(225).chr(187).chr(152) => 'O',chr(225).chr(187).chr(153) => 'o',
chr(225).chr(187).chr(162) => 'O',chr(225).chr(187).chr(163) => 'o',
chr(85) => 'U',chr(117) => 'u',
chr(198).chr(175) => 'U',chr(198).chr(176) => 'u',
chr(195).chr(153) => 'U',chr(195).chr(185) => 'u',
chr(225).chr(187).chr(170) => 'U',chr(225).chr(187).chr(171) => 'u',
chr(195).chr(154) => 'U',chr(195).chr(186) => 'u',
chr(225).chr(187).chr(168) => 'U',chr(225).chr(187).chr(169) => 'u',
chr(225).chr(187).chr(166) => 'U',chr(225).chr(187).chr(167) => 'u',
chr(225).chr(187).chr(172) => 'U',chr(225).chr(187).chr(173) => 'u',
chr(196).chr(168) => 'U',chr(196).chr(169) => 'u',
chr(197).chr(168) => 'U',chr(197).chr(169) => 'u',
chr(225).chr(187).chr(174) => 'U',chr(225).chr(187).chr(175) => 'u',
chr(225).chr(187).chr(164) => 'U',chr(225).chr(187).chr(165) => 'u',
chr(225).chr(187).chr(176) => 'U',chr(225).chr(187).chr(177) => 'u',
chr(89) => 'Y',chr(121) => 'y',
chr(225).chr(187).chr(178) => 'Y',chr(225).chr(187).chr(179) => 'y',
chr(195).chr(157) => 'Y',chr(195).chr(189) => 'y',
chr(225).chr(187).chr(182) => 'Y',chr(225).chr(187).chr(183) => 'y',
chr(225).chr(187).chr(184) => 'Y',chr(225).chr(187).chr(185) => 'y',
chr(225).chr(187).chr(180) => 'Y',chr(225).chr(187).chr(181) => 'y',
chr(68) => 'D',chr(100) => 'd',
chr(196).chr(144) => 'D',chr(196).chr(145) => 'd',

Đây là đoạn code của WordPress

// Vowels with diacritic (Vietnamese)
// unmarked
chr(198).chr(160) => 'O', chr(198).chr(161) => 'o',
chr(198).chr(175) => 'U', chr(198).chr(176) => 'u',
// grave accent
chr(225).chr(186).chr(166) => 'A', chr(225).chr(186).chr(167) => 'a',
chr(225).chr(186).chr(176) => 'A', chr(225).chr(186).chr(177) => 'a',
chr(225).chr(187).chr(128) => 'E', chr(225).chr(187).chr(129) => 'e',
chr(225).chr(187).chr(146) => 'O', chr(225).chr(187).chr(147) => 'o',
chr(225).chr(187).chr(156) => 'O', chr(225).chr(187).chr(157) => 'o',
chr(225).chr(187).chr(170) => 'U', chr(225).chr(187).chr(171) => 'u',
chr(225).chr(187).chr(178) => 'Y', chr(225).chr(187).chr(179) => 'y',
// hook
chr(225).chr(186).chr(162) => 'A', chr(225).chr(186).chr(163) => 'a',
chr(225).chr(186).chr(168) => 'A', chr(225).chr(186).chr(169) => 'a',
chr(225).chr(186).chr(178) => 'A', chr(225).chr(186).chr(179) => 'a',
chr(225).chr(186).chr(186) => 'E', chr(225).chr(186).chr(187) => 'e',
chr(225).chr(187).chr(130) => 'E', chr(225).chr(187).chr(131) => 'e',
chr(225).chr(187).chr(136) => 'I', chr(225).chr(187).chr(137) => 'i',
chr(225).chr(187).chr(142) => 'O', chr(225).chr(187).chr(143) => 'o',
chr(225).chr(187).chr(148) => 'O', chr(225).chr(187).chr(149) => 'o',
chr(225).chr(187).chr(158) => 'O', chr(225).chr(187).chr(159) => 'o',
chr(225).chr(187).chr(166) => 'U', chr(225).chr(187).chr(167) => 'u',
chr(225).chr(187).chr(172) => 'U', chr(225).chr(187).chr(173) => 'u',
chr(225).chr(187).chr(182) => 'Y', chr(225).chr(187).chr(183) => 'y',
// tilde
chr(225).chr(186).chr(170) => 'A', chr(225).chr(186).chr(171) => 'a',
chr(225).chr(186).chr(180) => 'A', chr(225).chr(186).chr(181) => 'a',
chr(225).chr(186).chr(188) => 'E', chr(225).chr(186).chr(189) => 'e',
chr(225).chr(187).chr(132) => 'E', chr(225).chr(187).chr(133) => 'e',
chr(225).chr(187).chr(150) => 'O', chr(225).chr(187).chr(151) => 'o',
chr(225).chr(187).chr(160) => 'O', chr(225).chr(187).chr(161) => 'o',
chr(225).chr(187).chr(174) => 'U', chr(225).chr(187).chr(175) => 'u',
chr(225).chr(187).chr(184) => 'Y', chr(225).chr(187).chr(185) => 'y',
// acute accent
chr(225).chr(186).chr(164) => 'A', chr(225).chr(186).chr(165) => 'a',
chr(225).chr(186).chr(174) => 'A', chr(225).chr(186).chr(175) => 'a',
chr(225).chr(186).chr(190) => 'E', chr(225).chr(186).chr(191) => 'e',
chr(225).chr(187).chr(144) => 'O', chr(225).chr(187).chr(145) => 'o',
chr(225).chr(187).chr(154) => 'O', chr(225).chr(187).chr(155) => 'o',
chr(225).chr(187).chr(168) => 'U', chr(225).chr(187).chr(169) => 'u',
// dot below
chr(225).chr(186).chr(160) => 'A', chr(225).chr(186).chr(161) => 'a',
chr(225).chr(186).chr(172) => 'A', chr(225).chr(186).chr(173) => 'a',
chr(225).chr(186).chr(182) => 'A', chr(225).chr(186).chr(183) => 'a',
chr(225).chr(186).chr(184) => 'E', chr(225).chr(186).chr(185) => 'e',
chr(225).chr(187).chr(134) => 'E', chr(225).chr(187).chr(135) => 'e',
chr(225).chr(187).chr(138) => 'I', chr(225).chr(187).chr(139) => 'i',
chr(225).chr(187).chr(140) => 'O', chr(225).chr(187).chr(141) => 'o',
chr(225).chr(187).chr(152) => 'O', chr(225).chr(187).chr(153) => 'o',
chr(225).chr(187).chr(162) => 'O', chr(225).chr(187).chr(163) => 'o',
chr(225).chr(187).chr(164) => 'U', chr(225).chr(187).chr(165) => 'u',
chr(225).chr(187).chr(176) => 'U', chr(225).chr(187).chr(177) => 'u',
chr(225).chr(187).chr(180) => 'Y', chr(225).chr(187).chr(181) => 'y',

Nhìn lại thì xem ra cũng không tối ưu được nhiều lắm, chỉ là tổ chức tốt hơn, chia thành nhiều nhóm nhỏ.

Jun 26, 2010 -

Things I have learned in programming (June 26, 2010)

Working in a startup company is an oportunity. You will have chances to get familiar with many programming languages. For me, they are PHP, JS, Python, XBL (Firefox Add-on), C#, C++, Bash, Windows Commandline (and of course, HTML and CSS)

XBL 1.0 is a Mozilla-specific technology, and not a W3C standard. However, at least two standards are being worked on: sXBL and XBL 2.0. In my opinion, XBL is more powerful than XHTML.

1. How to fix overflow problem?

There are so many ways to achieve this. I only show 2 ways.

1.a. The first way is using CSS overflow property. It’s CSS2. But you must set the width and height of container element in order to make overflow works properly.

#CF-carts-content, #CF-alerts-content, #CF-deals-content{
width:334px;
height:455px;
padding-bottom:5px;
overflow-x:hidden;
overflow-y:auto;
}

1.b. The second way is using XUL crop attribute. Yeah, XBL is more powerful. See this example code and result:

<xul:label class="CF-product-name CF-link" xbl:inherits="value=product_name" crop="end"/>

Jun 25, 2010 -

Things I have learned in C# (June 23, 2010)

Yesterday, I faced lots of problem in C#. Some were new, but some have already solved before but I don’t remember.
I think I should write them down, in case I miss it again.

1. Execute a Command in C#

CodeProject described two ways to run a command, synchronously and asynchronously

2. Build a .NET Solution or Project from the Command Line

This solution comes from C# Corner. devenv can run in command line mode. And the command for build a solution for release is

devenv /build [Debug|Release] solution_file