Làm cách nào để kiểm tra xem bộ mã của chuỗi có phải là UTF8 không?Cách kiểm tra bộ ký tự của chuỗi?
Trả lời
function is_utf8($string) {
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
}
Tôi đã kiểm tra. Chức năng này có hiệu quả.
nếu gửi nó đến u từ máy chủ
echo $_SERVER['HTTP_ACCEPT_CHARSET'];
Đừng phát minh lại bánh xe. Có một hàm dựng sẵn cho tác vụ đó: mb_check_encoding()
.
mb_check_encoding($string, 'UTF-8');
Đây là loại giải pháp của tôi! –
Điều gì sẽ xảy ra nếu bạn chưa cài đặt tiện ích đó? – CMCDragonkai
@CMCDragonkai Nếu dữ liệu của bạn ở định dạng nhiều byte (như UTF-8), bạn chắc chắn nên cài đặt phần mở rộng PHP cung cấp các chức năng hoạt động chính xác trên đầu vào của bạn. Nếu bạn sử dụng 'strlen' trên một chuỗi UTF-8, ví dụ, bạn sẽ nhận được độ dài sai nếu đầu vào chứa các ký tự không phải ASCII. – soulmerge
Tốt hơn, hãy sử dụng cả hai giải pháp trên.
function isUtf8($string) {
if (function_exists("mb_check_encoding") && is_callable("mb_check_encoding")) {
return mb_check_encoding($string, 'UTF8');
}
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
}
Gọi tới cả hàm function_exists() và is_callable() là dư thừa, bạn có thể bỏ qua một trong số chúng. Nhưng vì is_callable() được thiết kế để kiểm tra xem tham số có phải là một cuộc gọi lại hợp lệ hay không (xem liên kết bên dưới), tôi sẽ sử dụng function_exists() để làm cho nó dễ đọc hơn. Liên kết đến kiểu gọi lại giả: http://php.net/manual/en/language.pseudo-types.php#language.types.callback – soulmerge
@ nikc.org - Tôi không hiểu - tại sao bạn muốn thử nghiệm liệu hàm 'mb_check_encoding' có tồn tại không? – JDelage
@JDelage vì đó là một phần của phần mở rộng (php.net/manual/en/book.mbstring.php) không được đảm bảo để luôn có mặt. –
Chỉ cần một mặt lưu ý:
Bạn không thể xác định xem một chuỗi cho trước được mã hóa theo UTF-8. Bạn chỉ có thể xác định xem một chuỗi đã cho là dứt khoát là không phải là được mã hóa bằng UTF-8 hay không. Hãy xem một câu hỏi liên quan here:
Bạn không thể phát hiện nếu một chuỗi cho trước (hoặc chuỗi byte) là một UTF-8 mã hóa văn bản như ví dụ mỗi loạt các UTF-8 octet còn a là hợp lệ (nếu vô nghĩa) loạt các bảng chữ cái Latinh-1 (hoặc một số mã hóa khác). Tuy nhiên không phải mọi chuỗi hợp lệ Latin-1 octet đều hợp lệ với chuỗi UTF-8.
Không có câu trả lời nào ở trên là chính xác. Có, họ có thể đang làm việc. Nếu bạn nhận được câu trả lời với hàm preg_replace
, bạn có đang cố gắng giết máy chủ của mình nếu bạn xử lý nhiều sự khuấy động không? Sử dụng hàm PHP thuần túy này không có regex, làm việc 100% thời gian và nó nhanh hơn.
if(function_exists('grk_Is_UTF8') === FALSE){
function grk_Is_UTF8($String=''){
# On va calculer la longeur de la chaîne
$Len = strlen($String);
# On va boucler sur chaque caractère
for($i = 0; $i < $Len; $i++){
# On va aller chercher la valeur ASCII du caractère
$Ord = ord($String[$i]);
if($Ord > 128){
if($Ord > 247){
return FALSE;
} elseif($Ord > 239){
$Bytes = 4;
} elseif($Ord > 223){
$Bytes = 3;
} elseif($Ord > 191){
$Bytes = 2;
} else {
return FALSE;
}
#
if(($i + $Bytes) > $Len){
return FALSE;
}
# On va boucler sur chaque bytes/caractères
while($Bytes > 1){
# +1
$i++;
# On va aller chercher la valeur ASCII du caractère/byte
$Ord = ord($String[$i]);
if($Ord < 128 OR $Ord > 191){
return FALSE;
}
# Parfait
$Bytes--;
}
}
}
# Vrai
return TRUE;
}
}
mb_detect_encoding($string);
sẽ trả về bộ ký tự thực tế $string
. mb_check_encoding($string, 'UTF-8');
sẽ trở lại TRUE nếu bộ ký tự của $string
là UTF-8 khác FALSE
- 1. kiểm tra ký tự
- 2. Kiểm tra các ký tự đặc biệt (/ * - + _ @ & $ #%) trong một chuỗi?
- 3. Bash cần kiểm tra chuỗi ký tự chữ số
- 4. Kiểm tra các ký tự lặp lại trong một chuỗi
- 5. Php kiểm tra nếu chuỗi có ký tự Trung Quốc
- 6. cách nhanh chóng để kiểm tra xem một chuỗi ký tự không phải là số
- 7. Cách kiểm tra xem chuỗi có chứa chỉ các ký tự cụ thể
- 8. Xóa ký tự cuối cùng của chuỗi
- 9. Cách kiểm tra ký tự đầu tiên trong một chuỗi trong unix
- 10. Làm cách nào để kiểm tra chuỗi ký tự trong tài liệu bằng Javascript?
- 11. Cách kiểm tra xem ký tự trong chuỗi có phải là một chữ cái không? Python
- 12. Làm cách nào để kiểm tra xem chuỗi có chứa ký tự trong C#?
- 13. Công cụ để tự động kiểm tra kiểu chuỗi ký tự theo PEP257
- 14. Kiểm tra các chuỗi cho cùng một ký tự trong Objective-C
- 15. Kiểm tra từ sau ký tự '@' trong PHP
- 16. Kiểm tra xem chuỗi chứa ký tự không phải chữ số
- 17. ASP Classic: Kiểm tra xem chuỗi chỉ bao gồm các ký tự hợp lệ
- 18. cách kiểm tra số ký tự của một tệp trong python
- 19. Kiểm tra một chuỗi để xem nếu nó chứa ký tự số trong UNIX
- 20. JavaScript - kiểm tra các ký tự viết thường trong một chuỗi
- 21. Kiểm tra xem 2 chuỗi có chứa các ký tự giống nhau không?
- 22. Python: Làm cách nào để kiểm tra xem chuỗi unicode có chứa một ký tự được sắp xếp không?
- 23. GUID, chuỗi ký tự 30 ký tự
- 24. Cách kiểm tra mã không đồng bộ
- 25. Cần Regex kiểm tra ít nhất 4 ký tự khác nhau trong chuỗi
- 26. jQuery: Kiểm tra xem các ký tự đặc biệt có tồn tại trong chuỗi
- 27. RegEx để kiểm tra 3 hoặc nhiều lần xuất hiện liên tiếp của một ký tự
- 28. Cách kiểm tra xem ký tự Java có phải là ký hiệu tiền tệ không
- 29. angularjs - bộ kiểm tra kiểm tra
- 30. kiểm tra nội dung của chuỗi nhập
Bạn có thể có UTF-8 ** và ** ISO chuỗi mã hóa trong vòng 1 request/tập tin. Tiêu đề HTTP sẽ trợ giúp như thế nào trong mọi trường hợp? – DanFromGermany