Hướng dẫn php remove non utf-8 characters - php xóa các ký tự không phải utf-8

Đã hỏi 13 năm, 2 tháng trước 13 years, 2 months ago

Đã xem 227k lần 227k times

Tôi đang gặp sự cố với việc loại bỏ các ký tự không phải UTF8 khỏi chuỗi, không hiển thị đúng. Các ký tự giống như 0x97 0x61 0x6c 0x6f (biểu diễn hex)

Cách tốt nhất để loại bỏ chúng là gì? Biểu thức chính quy hay cái gì khác?

Hướng dẫn php remove non utf-8 characters - php xóa các ký tự không phải utf-8

hỏi ngày 9 tháng 9 năm 2009 lúc 18:33Sep 9, 2009 at 18:33

Dan Sosedoffdan SosesoffDan Sosedoff

2.8115 huy hiệu vàng27 Huy hiệu bạc34 Huy hiệu đồng5 gold badges27 silver badges34 bronze badges

3

Nếu bạn áp dụng

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
5 cho chuỗi UTF8 đã được trả về đầu ra UTF8 bị cắt xén.

Tôi đã thực hiện một chức năng giải quyết tất cả các vấn đề này. Nó được gọi là

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
6.

Bạn không cần biết mã hóa chuỗi của bạn là gì. Nó có thể là Latin1 (ISO8859-1), Windows-1252 hoặc UTF8 hoặc chuỗi có thể có hỗn hợp chúng.

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
6 sẽ chuyển đổi mọi thứ thành UTF8.

Tôi đã làm điều đó bởi vì một dịch vụ đã cho tôi một nguồn cấp dữ liệu tất cả đều bị rối, trộn các mã hóa đó trong cùng một chuỗi.

Usage:

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::toUTF8($mixed_string);

$latin1_string = Encoding::toLatin1($mixed_string);

Tôi đã bao gồm một chức năng khác, mã hóa :: fixutf8 (), sẽ sửa chữa mọi chuỗi UTF8 trông có vẻ bị cắt xén sản phẩm đã được mã hóa thành UTF8 nhiều lần.

Usage:

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

Examples:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

sẽ đầu ra:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

Download:

https://github.com/neitanod/forceutf8

Jason Aller

3,48728 Huy hiệu vàng42 Huy hiệu bạc38 Huy hiệu Đồng28 gold badges42 silver badges38 bronze badges

Đã trả lời ngày 19 tháng 8 năm 2010 lúc 11:44Aug 19, 2010 at 11:44

8

Sử dụng phương pháp Regex:

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);

Nó tìm kiếm các trình tự UTF-8 và chụp những chuỗi vào nhóm 1. Nó cũng khớp với các byte đơn không thể được xác định là một phần của chuỗi UTF-8, nhưng không nắm bắt được chúng. Thay thế là bất cứ điều gì được bắt vào nhóm 1. Điều này loại bỏ hiệu quả tất cả các byte không hợp lệ.

Có thể sửa chữa chuỗi, bằng cách mã hóa các byte không hợp lệ dưới dạng các ký tự UTF-8. Nhưng nếu các lỗi là ngẫu nhiên, điều này có thể để lại một số biểu tượng lạ.

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]               # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]    # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                      # ...one or more times
  )
| ( [\x80-\xBF] )                 # invalid byte in range 10000000 - 10111111
| ( [\xC0-\xFF] )                 # invalid byte in range 11000000 - 11111111
/x
END;
function utf8replacer($captures) {
  if ($captures[1] != "") {
    // Valid byte sequence. Return unmodified.
    return $captures[1];
  }
  elseif ($captures[2] != "") {
    // Invalid byte of the form 10xxxxxx.
    // Encode as 11000010 10xxxxxx.
    return "\xC2".$captures[2];
  }
  else {
    // Invalid byte of the form 11xxxxxx.
    // Encode as 11000011 10xxxxxx.
    return "\xC3".chr(ord($captures[3])-64);
  }
}
preg_replace_callback($regex, "utf8replacer", $text);

EDIT:

  • echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    
    8 sẽ khớp với các giá trị không trống (
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    
    9 được coi là trống).
  • Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    
    0 sẽ phù hợp với các giá trị không trống, bao gồm
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
    echo Encoding::fixUTF8("Fédération Camerounaise de Football");
    
    9.
  • Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    
    2 sẽ phù hợp với bất cứ điều gì ngoại trừ
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    
    3.

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
0 có vẻ là tốt nhất để sử dụng trong trường hợp này.

Tôi cũng đã tăng tốc trận đấu một chút. Thay vì khớp với từng ký tự một cách riêng biệt, nó phù hợp với chuỗi các ký tự UTF-8 hợp lệ.

Đã trả lời ngày 9 tháng 9 năm 2009 lúc 19:49Sep 9, 2009 at 19:49

Markus Jarderotmarkus JarderotMarkus Jarderot

85K20 Huy hiệu vàng135 Huy hiệu bạc137 Huy hiệu Đồng20 gold badges135 silver badges137 bronze badges

0

Hàm này loại bỏ tất cả các ký tự không phải ASCII, nó hữu ích nhưng không giải quyết được câu hỏi: Đây là chức năng của tôi luôn hoạt động, bất kể mã hóa:
This is my function that always works, regardless of encoding:

function remove_bs($Str) {  
  $StrArr = str_split($Str); $NewStr = '';
  foreach ($StrArr as $Char) {    
    $CharNo = ord($Char);
    if ($CharNo == 163) { $NewStr .= $Char; continue; } // keep £ 
    if ($CharNo > 31 && $CharNo < 127) {
      $NewStr .= $Char;    
    }
  }  
  return $NewStr;
}

Làm thế nào nó hoạt động:

echo remove_bs('Hello õhowå åare youÆ?'); // Hello how are you?

John

7.2563 huy hiệu vàng49 Huy hiệu bạc51 Huy hiệu đồng3 gold badges49 silver badges51 bronze badges

Đã trả lời ngày 20 tháng 11 năm 2013 lúc 17:50Nov 20, 2013 at 17:50

Hướng dẫn php remove non utf-8 characters - php xóa các ký tự không phải utf-8

3

thử cái này:

$string = iconv("UTF-8","UTF-8//IGNORE",$string);

Theo hướng dẫn sử dụng ICONV, hàm sẽ lấy tham số đầu tiên làm ký tự đầu vào, tham số thứ hai làm ký tự đầu ra và thứ ba là chuỗi đầu vào thực tế.

Nếu bạn đặt cả ký tự đầu vào và đầu ra thành UTF-8 và nối cờ

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
5 vào độ chao đầu ra, hàm sẽ giảm (dải) tất cả các ký tự trong chuỗi đầu vào không thể được biểu thị bằng độ chách đầu ra. Do đó, lọc chuỗi đầu vào có hiệu lực.UTF-8, and append the
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
5 flag to the output charset, the function will drop(strip) all characters in the input string that can't be represented by the output charset. Thus, filtering the input string in effect.

Đã trả lời ngày 17 tháng 12 năm 2014 lúc 15:24Dec 17, 2014 at 15:24

Technoaryatechnoaryatechnoarya

2133 Huy hiệu bạc5 Huy hiệu Đồng3 silver badges5 bronze badges

4

UConverter có thể được sử dụng kể từ PHP 5.5. UConverter là lựa chọn tốt hơn nếu bạn sử dụng tiện ích mở rộng INTL và không sử dụng MBString.

function replace_invalid_byte_sequence($str)
{
    return UConverter::transcode($str, 'UTF-8', 'UTF-8');
}

function replace_invalid_byte_sequence2($str)
{
    return (new UConverter('UTF-8', 'UTF-8'))->convert($str);
}

HTMLSpecialchars có thể được sử dụng để loại bỏ chuỗi byte không hợp lệ kể từ Php 5.4. HTMLSpecialchars tốt hơn preg_match để xử lý kích thước lớn của byte và độ chính xác. Rất nhiều việc thực hiện sai bằng cách sử dụng biểu thức chính quy có thể được nhìn thấy.

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
0

Đã trả lời ngày 3 tháng 6 năm 2013 lúc 4:04Jun 3, 2013 at 4:04

Masakielasticmasakielasticmasakielastic

4,4601 Huy hiệu vàng 37 Huy hiệu bạc42 Huy hiệu đồng1 gold badge37 silver badges42 bronze badges

1

Xin chào bạn có thể sử dụng regex đơn giản

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
1

Nó sẽ cắt tất cả các ký tự không phải UTF-8 khỏi chuỗi

Đã trả lời ngày 17 tháng 3 năm 2021 lúc 16:09Mar 17, 2021 at 16:09

Hướng dẫn php remove non utf-8 characters - php xóa các ký tự không phải utf-8

Hat Inchat incHAT INC

Huy hiệu bạc 10115 Huy hiệu đồng1 silver badge5 bronze badges

1

Tôi đã tạo một chức năng xóa các ký tự UTF-8 không hợp lệ khỏi một chuỗi. Tôi đang sử dụng nó để mô tả rõ ràng về 27000 sản phẩm trước khi nó tạo tệp xuất XML.

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
2

Benrollag

1.2214 huy hiệu vàng16 Huy hiệu bạc21 Huy hiệu đồng4 gold badges16 silver badges21 bronze badges

Đã trả lời ngày 16 tháng 7 năm 2014 lúc 23:46Jul 16, 2014 at 23:46

Muminmuminmumin

711 Huy hiệu bạc1 Huy hiệu đồng1 silver badge1 bronze badge

1

Chào mừng bạn đến với năm 2019 và công cụ sửa đổi

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
6 trong Regex sẽ xử lý các ký tự Multibyte UTF-8 cho bạn

Nếu bạn chỉ sử dụng

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
7, bạn vẫn sẽ kết thúc với các ký tự không thể in trong chuỗi của mình

Phương pháp này sẽ:

  • Xóa tất cả các ký tự UTF-8 không hợp lệ với
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    
    8
  • Xóa tất cả các ký tự không thể in như
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    Fédération Camerounaise de Football
    
    9,
    $regex = <<<'END'
    /
      (
        (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
        |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
        |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
        |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
        ){1,100}                        # ...one or more times
      )
    | .                                 # anything else
    /x
    END;
    preg_replace($regex, '$1', $text);
    
    0 (null-byte) và các ký tự điều khiển khác với
    $regex = <<<'END'
    /
      (
        (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
        |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
        |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
        |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
        ){1,100}                        # ...one or more times
      )
    | .                                 # anything else
    /x
    END;
    preg_replace($regex, '$1', $text);
    
    1

method:

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
3

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);
2 khớp với tất cả các ký tự có thể in và
$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);
3 mới và tước mọi thứ khác

Bạn có thể thấy bảng ASCII bên dưới .. Các ký tự có thể in được từ 32 đến 127, nhưng Newline

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);
3 là một phần của ký tự điều khiển nằm trong khoảng từ 0 đến 31 vì vậy chúng tôi phải thêm dòng mới vào Regex
$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);
5

Hướng dẫn php remove non utf-8 characters - php xóa các ký tự không phải utf-8

Bạn có thể cố gắng gửi các chuỗi qua Regex với các ký tự ngoài phạm vi có thể in như

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);
6 (del),
$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);
7 (ESC), v.v. và xem cách chúng bị tước

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
4

https://www.tehplayground.com/q5sJ3FOddhv1atpR

Đã trả lời ngày 10 tháng 9 năm 2019 lúc 13:16Sep 10, 2019 at 13:16

Clarkkclarkkclarkk

26.5K68 Huy hiệu vàng186 Huy hiệu bạc325 Huy hiệu đồng68 gold badges186 silver badges325 bronze badges

3

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
5

Đã trả lời ngày 9 tháng 9 năm 2009 lúc 23:53Sep 9, 2009 at 23:53

AXELALIX AXELALIXAlix Axel

149K92 Huy hiệu vàng390 Huy hiệu bạc496 Huy hiệu Đồng92 gold badges390 silver badges496 bronze badges

Subr () có thể phá vỡ các ký tự đa byte của bạn!

Trong trường hợp của tôi, tôi đã sử dụng

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);
8 để đảm bảo giá trị do người dùng cung cấp sẽ phù hợp với cơ sở dữ liệu. Thỉnh thoảng nó sẽ chia một ký tự đa byte làm đôi và gây ra lỗi cơ sở dữ liệu với "giá trị chuỗi không chính xác".

Bạn có thể sử dụng

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]                 # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]      # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2}   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3}   # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                        # ...one or more times
  )
| .                                 # anything else
/x
END;
preg_replace($regex, '$1', $text);
9 và có thể ổn đối với MySQL 5, nhưng MySQL 4 đếm byte thay vì các ký tự, vì vậy nó vẫn sẽ quá dài tùy thuộc vào số lượng ký tự đa byte.

Để ngăn chặn những vấn đề này, tôi đã thực hiện các bước sau:

  1. Tôi đã tăng kích thước của trường (trong trường hợp này là nhật ký thay đổi, vì vậy việc ngăn chặn đầu vào dài hơn không phải là một lựa chọn.)
  2. Tôi vẫn đã làm
    $regex = <<<'END'
    /
      (
        (?: [\x00-\x7F]               # single-byte sequences   0xxxxxxx
        |   [\xC0-\xDF][\x80-\xBF]    # double-byte sequences   110xxxxx 10xxxxxx
        |   [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences   1110xxxx 10xxxxxx * 2
        |   [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
        ){1,100}                      # ...one or more times
      )
    | ( [\x80-\xBF] )                 # invalid byte in range 10000000 - 10111111
    | ( [\xC0-\xFF] )                 # invalid byte in range 11000000 - 11111111
    /x
    END;
    function utf8replacer($captures) {
      if ($captures[1] != "") {
        // Valid byte sequence. Return unmodified.
        return $captures[1];
      }
      elseif ($captures[2] != "") {
        // Invalid byte of the form 10xxxxxx.
        // Encode as 11000010 10xxxxxx.
        return "\xC2".$captures[2];
      }
      else {
        // Invalid byte of the form 11xxxxxx.
        // Encode as 11000011 10xxxxxx.
        return "\xC3".chr(ord($captures[3])-64);
      }
    }
    preg_replace_callback($regex, "utf8replacer", $text);
    
    0 trong trường hợp nó vẫn còn quá lâu
  3. Tôi đã sử dụng câu trả lời được chấp nhận ở trên bởi @Markus Jarderot để đảm bảo nếu có một mục thực sự dài với một ký tự đa byte ngay ở giới hạn độ dài, chúng ta có thể loại bỏ một nửa ký tự đa byte ở cuối.

Đã trả lời ngày 14 tháng 1 năm 2021 lúc 22:18Jan 14, 2021 at 22:18

Hướng dẫn php remove non utf-8 characters - php xóa các ký tự không phải utf-8

Fortefrank FortefrankFrank Forte

1.85718 Huy hiệu bạc18 Huy hiệu đồng18 silver badges18 bronze badges

1

Vì vậy, các quy tắc là octlet UTF-8 đầu tiên có bit cao được đặt làm điểm đánh dấu, và sau đó 1 đến 4 bit để cho biết có bao nhiêu octlet bổ sung; Sau đó, mỗi octlet bổ sung phải có hai bit cao được đặt thành 10.

Pseudo-python sẽ là:

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
6

Logic tương tự này phải được dịch sang PHP. Tuy nhiên, không rõ loại tước nào sẽ được thực hiện một khi bạn có được một nhân vật dị dạng.

Đã trả lời ngày 9 tháng 9 năm 2009 lúc 18:49Sep 9, 2009 at 18:49

Sẽ sẽWill

72.6K38 Huy hiệu vàng167 Huy hiệu bạc239 Huy hiệu Đồng38 gold badges167 silver badges239 bronze badges

1

Từ bản vá gần đây đến mô -đun phân tích cú pháp JSON của Drupal:

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
7

Nếu bạn lo ngại có, nó giữ lại không gian như các ký tự hợp lệ.

Đã làm những gì tôi cần. Nó loại bỏ các ký tự biểu tượng cảm xúc ngày nay không phù hợp với bộ ký tự 'UTF8' của MySQL và điều đó đã cho tôi các lỗi như "SQLSTATE [HY000]: Lỗi chung: 1366 Giá trị chuỗi không chính xác".

Để biết chi tiết, xem https://www.drupal.org/node/1824506#comment-6881382

Đã trả lời ngày 25 tháng 6 năm 2015 lúc 3:41Jun 25, 2015 at 3:41

Hướng dẫn php remove non utf-8 characters - php xóa các ký tự không phải utf-8

5

Để xóa tất cả các ký tự Unicode bên ngoài mặt phẳng ngôn ngữ cơ bản Unicode:

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
8

Hướng dẫn php remove non utf-8 characters - php xóa các ký tự không phải utf-8

Sam Hanley

4.6647 Huy hiệu vàng36 Huy hiệu bạc60 Huy hiệu Đồng7 gold badges36 silver badges60 bronze badges

Đã trả lời ngày 8 tháng 2 năm 2013 lúc 16:55Feb 8, 2013 at 16:55

2

Tôi đã thử nhiều giải pháp được trình bày về chủ đề này, nhưng không có gì trong số chúng làm việc cho tôi, trong trường hợp cụ thể của tôi. Nhưng tôi đã tìm thấy một giải pháp tốt trên liên kết này: https://www.ryadel.com/en/php-skip-invalid-characters-utf-8-xml-file-string/

Về cơ bản, đây là chức năng giải quyết cho tôi:

require_once('Encoding.php'); 
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);
9

Hy vọng nó sẽ giúp một số bạn.

Đã trả lời ngày 14 tháng 5 năm 2021 lúc 19:51May 14, 2021 at 19:51

Hướng dẫn php remove non utf-8 characters - php xóa các ký tự không phải utf-8

Công việc vệ sinh tiếp theo cho tôi:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
0

Đã trả lời ngày 26 tháng 5 năm 2021 lúc 11:39May 26, 2021 at 11:39

Adam Peryadam PeryAdam Pery

1.84621 Huy hiệu bạc20 Huy hiệu đồng21 silver badges20 bronze badges

Hơi khác với câu hỏi, nhưng những gì tôi đang làm là sử dụng htmlencode (chuỗi),

Mã giả ở đây

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
1

đầu vào và đầu ra

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
2

Tôi biết nó không hoàn hảo, nhưng làm công việc cho tôi.

Đã trả lời ngày 12 tháng 12 năm 2013 lúc 2:26Dec 12, 2013 at 2:26

Misaximisaximisaxi

5682 Huy hiệu bạc10 Huy hiệu đồng2 silver badges10 bronze badges

Có thể không phải là giải pháp chính xác nhất, nhưng nó hoàn thành công việc với một dòng mã duy nhất:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
3

$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]               # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]    # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                      # ...one or more times
  )
| ( [\x80-\xBF] )                 # invalid byte in range 10000000 - 10111111
| ( [\xC0-\xFF] )                 # invalid byte in range 11000000 - 11111111
/x
END;
function utf8replacer($captures) {
  if ($captures[1] != "") {
    // Valid byte sequence. Return unmodified.
    return $captures[1];
  }
  elseif ($captures[2] != "") {
    // Invalid byte of the form 10xxxxxx.
    // Encode as 11000010 10xxxxxx.
    return "\xC2".$captures[2];
  }
  else {
    // Invalid byte of the form 11xxxxxx.
    // Encode as 11000011 10xxxxxx.
    return "\xC3".chr(ord($captures[3])-64);
  }
}
preg_replace_callback($regex, "utf8replacer", $text);
1 sẽ chuyển đổi các ký tự thành dấu hỏi;
$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]               # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]    # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                      # ...one or more times
  )
| ( [\x80-\xBF] )                 # invalid byte in range 10000000 - 10111111
| ( [\xC0-\xFF] )                 # invalid byte in range 11000000 - 11111111
/x
END;
function utf8replacer($captures) {
  if ($captures[1] != "") {
    // Valid byte sequence. Return unmodified.
    return $captures[1];
  }
  elseif ($captures[2] != "") {
    // Invalid byte of the form 10xxxxxx.
    // Encode as 11000010 10xxxxxx.
    return "\xC2".$captures[2];
  }
  else {
    // Invalid byte of the form 11xxxxxx.
    // Encode as 11000011 10xxxxxx.
    return "\xC3".chr(ord($captures[3])-64);
  }
}
preg_replace_callback($regex, "utf8replacer", $text);
2 sẽ loại bỏ các dấu hỏi.
$regex = <<<'END'
/
  (
    (?: [\x00-\x7F]               # single-byte sequences   0xxxxxxx
    |   [\xC0-\xDF][\x80-\xBF]    # double-byte sequences   110xxxxx 10xxxxxx
    |   [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences   1110xxxx 10xxxxxx * 2
    |   [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 
    ){1,100}                      # ...one or more times
  )
| ( [\x80-\xBF] )                 # invalid byte in range 10000000 - 10111111
| ( [\xC0-\xFF] )                 # invalid byte in range 11000000 - 11111111
/x
END;
function utf8replacer($captures) {
  if ($captures[1] != "") {
    // Valid byte sequence. Return unmodified.
    return $captures[1];
  }
  elseif ($captures[2] != "") {
    // Invalid byte of the form 10xxxxxx.
    // Encode as 11000010 10xxxxxx.
    return "\xC2".$captures[2];
  }
  else {
    // Invalid byte of the form 11xxxxxx.
    // Encode as 11000011 10xxxxxx.
    return "\xC3".chr(ord($captures[3])-64);
  }
}
preg_replace_callback($regex, "utf8replacer", $text);
2 will strip out the question marks.

סטנל גר TOUR

2.87923 Huy hiệu vàng47 Huy hiệu bạc66 Huy hiệu Đồng23 gold badges47 silver badges66 bronze badges

Đã trả lời ngày 26 tháng 12 năm 2019 lúc 17:18Dec 26, 2019 at 17:18

2

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
4

Nó hoạt động trên dịch vụ của chúng tôi

Đã trả lời ngày 15 tháng 1 năm 2020 lúc 11:44Jan 15, 2020 at 11:44

llluollluollluo

11 Huy hiệu Đồng1 bronze badge

1

Làm thế nào về ICONV:

http://php.net/manual/en/function.iconv.php

Không sử dụng nó bên trong bản thân PHP nhưng nó luôn hoạt động tốt cho tôi trên dòng lệnh. Bạn có thể lấy nó để thay thế các ký tự không hợp lệ.

Đã trả lời ngày 9 tháng 9 năm 2009 lúc 19:53Sep 9, 2009 at 19:53

BenbenBen

6233 Huy hiệu bạc12 Huy hiệu Đồng3 silver badges12 bronze badges