Có vẻ như MySQL does not support ký tự có nhiều hơn 3 byte trong bộ ký tự UTF-8 mặc định của nó. Vì vậy, trong PHP, làm cách nào tôi có thể loại bỏ tất cả 4 ký tự byte (và nhiều hơn) trong một chuỗi và thay thế chúng bằng một số ký tự khác như một số ký tự khác không? Không.Làm thế nào để thay thế/loại bỏ 4 (+) - byte ký tự từ một chuỗi UTF-8 trong PHP?
Trả lời
Chú ý: bạn không nên chỉ dải, nhưng thay thế với nhân vật thay thế U + FFFD để tránh các cuộc tấn unicode, chủ yếu là XSS:
http://unicode.org/reports/tr36/#Deletion_of_Noncharacters
preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $value);
Dưới đây là một ví dụ:
<?php
mb_internal_encoding("UTF-8");
//utf8 string, 13 bytes, 9 utf8 chars, 7 ASCII, 1 in latin1, 1 outside the BMP
$str = "qué \xF0\x9D\x92\xB3 tal";
$array = mbStringToArray($str);
print "str: [$str] strlen:" . strlen($str) . " chars:" . count($array) . "\n";
$str1 = "";
foreach($array as $c) {
// print "$c : " . strlen($c) ."\n";
$str1 .= strlen($c)<=3? $c : '?';
}
print "[$str1]\n";
function mbStringToArray ($str) {
if (empty($str)) return false;
$len = mb_strlen($str);
$array = array();
for ($i = 0; $i < $len; $i++) {
$array[] = mb_substr($str, $i, 1);
}
return $array;
}
Hoặc, một chút nhỏ gọn và hiệu quả hơn:
<?php ///
mb_internal_encoding("UTF-8");
//utf8 string, 13 bytes, 9 utf8 chars, 7 ASCII, 1 in latin1, 1 outside the BMP
$str = "qué \xF0\x9D\x92\xB3 tal";
$str1 = trimOutsideBMP($str);
print "original: [$str]\n";
print "trimmed: [$str1]\n";
// Replaces non-BMP characters in the UTF-8 string by a '?' character
// Assumes UTF-8 default encoding (if not sure, call first mb_internal_encoding("UTF-8");)
function trimOutsideBMP($str) {
if (empty($str)) return $str;
$len = mb_strlen($str);
$str1 = '';
for ($i = 0; $i < $len; $i++) {
$c = mb_substr($str, $i, 1);
$str1 .= strlen($c) <= 3 ? $c : '?';
}
return $str1;
}
Came qua câu hỏi này khi cố gắng giải quyết vấn đề của riêng tôi (Facebook spits ra biểu tượng cảm xúc nhất định là 4 các ký tự byte, Amazon Mechanical Turk không chấp nhận các ký tự 4 byte).
tôi đã kết thúc bằng này, không đòi hỏi mở rộng mbstring:
function remove_4_byte($string) {
$char_array = preg_split('/(?<!^)(?!$)/u', $string);
for($x=0;$x<sizeof($char_array);$x++) {
if(strlen($char_array[$x])>3) {
$char_array[$x] = "";
}
}
return implode($char_array, "");
}
Vì một số lý do tôi không thể khiến những người khác làm việc, điều này thực hiện một mẹo. – Mahn
Từ 4-byte UTF-8 chuỗi luôn luôn bắt đầu với các byte 0xF0-0xF7
, sau đây nên làm việc:
$str = preg_replace('/[\xF0-\xF7].../s', '', $str);
Hoặc, bạn có thể sử dụng preg_replace
ở chế độ UTF-8 nhưng điều này có thể sẽ chậm hơn:
$str = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $str);
Điều này hoạt động vì các chuỗi UTF-8 4 byte được sử dụng cho các điểm mã trong các máy bay Unicode bổ sung bắt đầu từ 0x10000
.
Dưới sự thay đổi chức năng 3 và 4 ký tự byte từ utf8 chuỗi '#':
function remove3and4bytesCharFromUtf8Str($str) {
return preg_replace('/([\xF0-\xF7]...)|([\xE0-\xEF]..)/s', '#', $str);
}
đây là thực hiện của tôi để lọc ra các ký tự 4-byte
0.123.$string = preg_replace_callback(
'/./u',
function (array $match) {
return strlen($match[0]) >= 4 ? null : $match[0];
},
$string
);
bạn có thể tinh chỉnh và thay thế null
(loại bỏ char) bằng một số chuỗi thay thế. Bạn cũng có thể thay thế >= 4
bằng một số kiểm tra chiều dài byte khác.
- 1. Làm thế nào để thay thế/loại bỏ 4 (+) - byte ký tự từ một chuỗi UTF-8 trong Java?
- 2. Làm thế nào để loại bỏ 4 byte utf-8 ký tự trong Ruby?
- 3. Làm thế nào để cắt ngắn chuỗi UTF8 trong PHP?
- 4. Regex để loại bỏ các ký tự không phải chữ và số từ các chuỗi UTF8
- 5. Làm thế nào để chuyển đổi (chuyển ngữ) một chuỗi từ utf8 sang ASCII (byte đơn) trong C#?
- 6. Có phải mb_ * cần thiết để thay thế các ký tự một byte từ một chuỗi nhiều byte không?
- 7. Làm thế nào để thay thế một ký tự đơn bên trong một chuỗi trong Golang?
- 8. Làm thế nào để loại bỏ một số ký tự từ chuỗi của tôi
- 9. Làm thế nào để thay thế một ký tự từ một String trong SQL?
- 10. Làm thế nào để bạn kéo 100 ký tự đầu tiên của một chuỗi trong PHP
- 11. Làm thế nào để thay thế các ký tự trong một chuỗi java?
- 12. Thay thế một ký tự bằng một chuỗi trong LaTeX
- 13. Làm thế nào tôi có thể loại bỏ các ký tự NULL từ chuỗi
- 14. Làm thế nào để xóa tất cả các ký tự sau một ký tự trong chuỗi?
- 15. Thay thế một ký tự của một chuỗi trong python
- 16. Thay thế chuỗi ký tự trong java
- 17. Làm cách nào để thay thế chuỗi con của chuỗi trước một ký tự cụ thể?
- 18. Làm thế nào để chia chuỗi bằng nhiều ký tự trong MSBuild 4?
- 19. Python 3: Làm thế nào để có được một chuỗi ký tự bằng chữ của một chuỗi byte?
- 20. Làm thế nào để đặt một ký tự Unicode bổ sung trong một chuỗi chữ?
- 21. Ký tự này là gì (Â) và làm thế nào để loại bỏ nó bằng PHP?
- 22. Làm thế nào bạn có thể loại bỏ các ký tự trùng lặp trong một chuỗi?
- 23. Thay thế một ký tự bằng một ký tự khác trong một chuỗi trong android?
- 24. Javascript - Thay thế ký tự thoát trong một chuỗi chữ
- 25. Làm thế nào để thay thế nhiều mục từ một chuỗi văn bản trong PHP?
- 26. C#: Chuyển đổi byte [] thành chuỗi được mã hóa UTF8
- 27. Thay thế nhiều ký tự trong một chuỗi (XSLT)
- 28. Làm thế nào để loại bỏ tất cả các ký tự sau một ký tự cụ thể trong python?
- 29. Làm thế nào để chuyển đổi một chuỗi từ UTF8 sang Latin1 trong C/C++?
- 30. Làm thế nào để thay đổi mã hóa ký tự của kết nối PDO/SQLite trong PHP?
Bạn có chắc chắn rằng dữ liệu bạn sẽ thao tác sẽ bao giờ chứa các ký tự không phù hợp với utf8 3 byte của mysql? – newtover
Bạn có chắc chắn rằng có cả * các ký tự tương tự không? 3 byte cung cấp cho bạn toàn bộ Máy bay đa ngôn ngữ cơ bản; nếu bạn cần nhiều ký tự hiếm hơn, hãy xem xét mã hóa Unicode khác (ví dụ: utf-16). – Piskvor
Vấn đề là tôi muốn tránh những cái khác, bởi vì MySQL cắt ngắn văn bản tại thời điểm đó nếu ai đó đặt một trong những nhân vật đặc biệt trong đó. – Franz