Vấn đề tìm kiếm không ra kết quả, kết quả thiếu khi nhập text 1 bytes, 2 bytes.



Lưu Chí Thành / 15-10-2018

Tình huống

Khi lập trình web cho khách hàng sử dụng ngôn ngữ 2 bytes như là Nhật, Trung Quốc,… thì sẽ gặp phải vấn đề tương tự như sau:

  • Nhập cùng 1 chuỗi ký tự (1 bytes) và tìm thì ra kết quả.
  • Nhập cùng chuỗi ký tự trên (nhưng là loại 2 bytes) và tìm thì lại không ra kết quả hoặc kết quả không đủ.
  • Nhập text vừa có loại 1 bytes vừa có loại 2 bytes và tìm thì lại không ra kết quả hoặc kết quả không đủ.

Nguyên nhân

Khi lưu data thì lưu theo dạng 1 bytes, 2 bytes hoặc kết hợp vừa 1 bytes vừa 2 bytes. Nhưng khi tìm thì lại tìm với từ khóa ngược lại nên kết quả tìm không ra.

Giải pháp

1. Khi tìm thì gõ chính xác text và đúng số bytes rồi tìm => Cách này phiền phức và kết quả tìm ra sẽ không đầy đủ (trường hợp có data thuộc kết quả tìm nhưng được lưu theo dạng bytes ngược lại).

2. Khi lưu sẽ tự động chuyển data đã nhập thành dạng 1 bytes hoặc 2 bytes (tùy theo yêu cầu) rồi lưu lại. tất nhiên khi tìm kiếm thì cũng sẽ tự động chuyển text đã nhập về đúng dạng bytes với khi lưu data rồi mới chạy chức năng tìm kiếm. Như vậy sẽ luôn đảm bảo kết quả ra đúng. Bên dưới là một số hàm dùng để chuyển đổi qua lại giữa 2 bytes <=> 1 bytes.

Option
Tùy chọn
Processing Content
Nội dung xử lý
Example
Ví dụ
r Đổi text tiếng latinh 2 bytes => 1 bytes. ABCD => ABCD
R Đổi text tiếng latinh 1 bytes => 2 bytes. ABCD =>ABCD
n Đổi số 2 bytes => 1 bytes. 1234 => 1234
N Đổi số 1 bytes => 2 bytes. 1234 => 1234
a Đổi số tiếng latinh 2 bytes => 1 bytes 1234 => 1234
A Đổi số tiếng latinh 1 bytes => 2 bytes. 1234 => 1234
s Đổi space (cách khoảng) 2 bytes => 1 bytes
(U+3000 => U+0020)
“ ” => ” “
2 bytes => 1 bytes
S Đổi space (cách khoảng) 1 bytes => 2 bytes
(U+0020 → U+3000)
” ” => “ ”
1 bytes => 2 bytes
k Đổi text Katakana 2 bytes => text Katakana 1 bytes. タナカ => タナカ
K Đổi text Katakana 1 bytes => text Katakana 2 bytes. タナカ => タナカ
h Đổi text Hiragana 2 bytes => text Katakana 1 bytes. あいうえお => ァィゥェォ
H Đổi text Katakana 1 bytes => text Hiragana 2 bytes. ァィゥェォ => あいうえお
c Đổi text Katakana 2 bytes => text Hiragana 2 bytes. アイウエオ => あいうえお
C Đổi text Hiragana 2 bytes => text Katakana 2 bytes. あいうえお => アイウエオ
V Chuyển đổi ký tự và dấu 〃, ゜ kèm theo (2 ký tự) thành 1 ký tự. sử dụng chung với K, H. か〃 => が
2 ký tự => 1 ký tự

 

Mẫu code

Mẫu code chuyển chuỗi ký tự trộn lẫn vừa 1 bytes vừa 2 bytes qua lại từ 1 bytes <=> 2 bytes.

mb_convert_kana(chuỗi ký tự [,option] )
<?php
/* định nghĩ chuỗi ký tự */
$str_kana = “ABC ABC 123 123 アイウエオ アイウエオ”;

/* chuyển đổi 1 bytes <=> 2 bytes */
var_dump( mb_convert_kana($str_kana) );
var_dump( mb_convert_kana($str_kana, ‘kvrn’) );
var_dump( mb_convert_kana($str_kana, ‘KVRN’) );
?>

Kết quả sau khi thực hiện

Dựa theo option (tùy chọn) mà sẽ chuyển đổi 1 bytes <=> 2 bytes.

string(59) “ABC ABC 123 123 アイウエオ アイウエオ”

string(47) “ABC ABC 123 123 アイウエオ アイウエオ”

string(71) “ABC ABC 123 123 アイウエオ アイウエオ”

Nguồn tham khảo: https://webkaru.net/php/function-mb-convert-kana/

Tái bút: Kinh nghiệm rút ra từ dự án TOLINEN.

 


to-top