09/10/2018, 23:21
Muôn thuở vẫn là bó tay với tiếng Việt (trong MySQL)
Xin chào các bạn,
Mình rất lấy làm điên đầu và phải nói là chào thua khi vấn đề này nó vẫn cứ đeo đẳng chúng ta những người mà có trang web chạy trên nền Apache + MySQL + PHP.
Chúng ta thử cùng nhau đi tìm lời giải cho rốt ráo vấn đề này đi xem thử có thành công.
Đây là hoàn cảnh mà vấn đề nảy sinh:
1) Trang web hiển thị tiếng Việt không đúng dù đã chỉnh đủ kiểu encoding.
2) Nhập dữ liệu với phpMyAdmin bằng tiếng Việt có dấu với charset là UTF-8 hoặc Unicode, dùng đúng bộ gõ ở mã Unicode thì sau đó vẫn ra giun dế không đọc được.
3) Rắc rối giữa các phiên bản MySQL 3.23.xx, 4.0.xx, 4.1.xx, 5.xx.xx và vân vân... các kiểu charset, collation,...
4) Nhập tiếng Việt tốt, hiển thị tiếng Việt tốt nhưng khi backup lại và phục hồi lại dữ liệu từ file .sql (hoặc dạng nén .zip / Gzip của nó) thì ...ôi thôi : Chúa ơi, cứu con với!
5) Vấn đề có lẽ không do trình duyệt, không phải bởi font chữ, cũng chẳng phải PHP hay MySQL gì cả. Phải chăng server không hỗ trợ?!
6) Dường như các hàm của PHP xử lý chuỗi theo kiểu Byte nên tiếng Việt có dấu là không thể? (Ví dụ: Trường em thì không phải có độ dài là 9 ký tự mà nó là số cần phải lập hàm để tính, cũng khá rắc rối đây. Ký tự nào tiếng Việt chiếm 2byte, ký tự nào 1byte đây. Vất vả quá đi mất.
Mong rằng các bạn cùng thảo luận để chúng ta có thể đưa ra một vài hàm hoặc class để có thể áp dụng xử lý chuỗi để không còn phải đối đầu với vấn đề tiếng Việt giun dế nữa. Được như vậy thì với một vài phiên bản PHP + MySQL + Apache thông dụng mà các host hay chạy chúng ta có thể áp dụng "bộ công cụ" chúng ta có để hạn chế cảnh dở khóc dở cười khi sao lưu => phục hồi, di chuyển thì host này sang host khác, bị lỗi các ký từ à...
Nếu cực đoan quá mức có lẽ sử dụng hàm loại bỏ tất cả dấu tiếng Việt đi cho đỡ rắc rối nhỉ?
Chúng ta cùng trao đổi với nhau, những ai có chút kinh nghiệm về việc này chia sẻ cùng anh em với nào.
Mình rất lấy làm điên đầu và phải nói là chào thua khi vấn đề này nó vẫn cứ đeo đẳng chúng ta những người mà có trang web chạy trên nền Apache + MySQL + PHP.
Chúng ta thử cùng nhau đi tìm lời giải cho rốt ráo vấn đề này đi xem thử có thành công.
Đây là hoàn cảnh mà vấn đề nảy sinh:
1) Trang web hiển thị tiếng Việt không đúng dù đã chỉnh đủ kiểu encoding.
2) Nhập dữ liệu với phpMyAdmin bằng tiếng Việt có dấu với charset là UTF-8 hoặc Unicode, dùng đúng bộ gõ ở mã Unicode thì sau đó vẫn ra giun dế không đọc được.
3) Rắc rối giữa các phiên bản MySQL 3.23.xx, 4.0.xx, 4.1.xx, 5.xx.xx và vân vân... các kiểu charset, collation,...
4) Nhập tiếng Việt tốt, hiển thị tiếng Việt tốt nhưng khi backup lại và phục hồi lại dữ liệu từ file .sql (hoặc dạng nén .zip / Gzip của nó) thì ...ôi thôi : Chúa ơi, cứu con với!
5) Vấn đề có lẽ không do trình duyệt, không phải bởi font chữ, cũng chẳng phải PHP hay MySQL gì cả. Phải chăng server không hỗ trợ?!
6) Dường như các hàm của PHP xử lý chuỗi theo kiểu Byte nên tiếng Việt có dấu là không thể? (Ví dụ: Trường em thì không phải có độ dài là 9 ký tự mà nó là số cần phải lập hàm để tính, cũng khá rắc rối đây. Ký tự nào tiếng Việt chiếm 2byte, ký tự nào 1byte đây. Vất vả quá đi mất.
Mong rằng các bạn cùng thảo luận để chúng ta có thể đưa ra một vài hàm hoặc class để có thể áp dụng xử lý chuỗi để không còn phải đối đầu với vấn đề tiếng Việt giun dế nữa. Được như vậy thì với một vài phiên bản PHP + MySQL + Apache thông dụng mà các host hay chạy chúng ta có thể áp dụng "bộ công cụ" chúng ta có để hạn chế cảnh dở khóc dở cười khi sao lưu => phục hồi, di chuyển thì host này sang host khác, bị lỗi các ký từ à...
Nếu cực đoan quá mức có lẽ sử dụng hàm loại bỏ tất cả dấu tiếng Việt đi cho đỡ rắc rối nhỉ?
Chúng ta cùng trao đổi với nhau, những ai có chút kinh nghiệm về việc này chia sẻ cùng anh em với nào.
Bài liên quan
Hy vọng mọi người thảo luận và cho biết kinh nghiệm giải quyết là gì?
Việc sao lưu, phục hồi database nên dùng công cụ nào là tốt nhất? Trường hợp nào làm thế nào?
Hiện nay mình rất sợ trường hợp sao lưu DB ngon lành đến khi trên mạng bị làm sao đó, phục hồi lại thì ôi thôi, toàn là mì gói vỡ vụn không làm sao cứu được. Ngồi cả mấy ngày đánh vật với cái file .sql đã sao lưu về tìm cách chuyển đổi nó thì cũng không thành công, chỗ nào có chữ à, ữ gì đó thì ra dấu ? hết trơn, nếu chỉ có duy nhất một chữ ra dấu ? thì tìm kiếm thay thế được, còn nó nhiều hơn 1 thì thua rồi.
Các bạn cùng thảo luận để giải quyết nhé, vấn đề này có từ 2001 đến nay vẫn chưa giải quyết xong thì không ổn, không bình thường tí nào.
Hàm tiếng Viết thì trên mạng có hàm thế này:
function unicode_strlen($s) {
$c = preg_match_all ('/./u', $s, $m);
return ($c);
}
echo unicode_strlen('Trường em'); #=> 9
trình duyệt dùng mã latin : WINDOWS-1259 hay gì đó
sử dụng hàm htmlspecialchar() để chuyển đổi qua lại giữ mã unicode và mã html, như vậy là trinh bày được thôi mà.
Còn server MYSQL thì có lúc nó chạy kô tốt với Unicode việt nam.
Muốn an toàn thì dùm mã unicode của HTML.
Nói chung, nguyên tắc là phải đồng bộ về charset.