2011-08-25 28 views
10

Đó là một chữ A có dấu^ở trên cùng: ÂKý tự này là gì (Â) và làm thế nào để loại bỏ nó bằng PHP?

Nó được hiển thị bằng chuỗi được kéo từ các trang web. Nó cho thấy nơi trước đây có một khoảng trống trong chuỗi gốc trên trang web gốc. Đây là ký tự thực được lưu trữ trong cơ sở dữ liệu của tôi. Nó cũng là những gì hiển thị trên trang web của tôi khi tôi echo một chuỗi có chứa nó.

Tôi nhận ra đó là sự cố mã hóa ký tự khi tôi xử lý trang web ban đầu, nhưng bây giờ tôi bị kẹt với các ký tự này trong cơ sở dữ liệu của mình. Tôi phải chuyển đổi ký tự này khi nó được hiển thị, hoặc một nơi nào khác trong php trước khi xuất html có chứa nó. Tôi không thể xử lý lại tài liệu gốc.

Tôi đã thử str_replace() và html_entity_decode() và không làm gì cả.

Tôi nên thử những gì khác?

+0

bạn không nên loại bỏ chúng bằng str_replace, bạn nên khắc phục vấn đề mã hóa đầu tiên. hãy xem xét điều này: http://stackoverflow.com/search?q=mysql+encoding và http://stackoverflow.com/search?q=php+encoding –

Trả lời

17

"Latin 1" là vấn đề của bạn ở đây. Có khoảng 65256 UTF-8 ký tự có sẵn cho một trang web mà bạn không thể lưu trữ trong trang mã Latinh-1.

Đối với vấn đề trước mắt của bạn, bạn sẽ có thể

$clean = str_replace(chr(194)," ",$dirty) 

Tuy nhiên tôi sẽ chuyển cơ sở dữ liệu của bạn để sử dụng utf-8 càng sớm càng tốt là vấn đề gần như chắc chắn sẽ tái xuất hiện.

+3

Ồ không, có ** nhiều ký tự hơn ** ... –

+0

Không gian mã Unicode tăng lên đến U + 10FFFF, vì vậy đó là khoảng một triệu điểm mã, cho hoặc lấy một vài mã bất hợp pháp. –

+0

đây là biểu đồ hữu ích để tham khảo các ký tự như sau: http://www.ascii-code.com/ –

6

Nó không thực sự là một nhân vật, và có thể là do sự lệch giữa mã hóa nội dung và mã hóa của trình duyệt. Hãy thử đặt mã hóa trang đã xuất của bạn thành trang bạn đang sử dụng.

ví dụ: Trong phần, sản lượng:

echo "<META http-equiv='Content-Type' content='text/html; charset=UTF-8'>"; 

(Điều chỉnh UTF-8 để bất cứ điều gì bạn đang sử dụng)

+0

+1 - đây là một vấn đề cần sửa chữa nguyên nhân gốc rễ (mặc dù chỉ thay đổi tiêu đề có thể không hoàn toàn cắt nó, tùy thuộc vào tình huống) –

+0

Đây là ký tự thực được lưu trữ trong cơ sở dữ liệu của tôi. Điều đó có thay đổi hoàn cảnh không? Mã hóa cơ sở dữ liệu của tôi là Latin 1 (mặc định). Tôi không quen với các vấn đề mã hóa. –

+1

Ồ vâng, xin lỗi tôi đã không đọc kỹ câu hỏi. Trong trường hợp đó, sau khi bạn lấy dữ liệu từ một trang khác, bạn cần phát hiện mã hóa của nó và chuyển đổi nó thành mã hóa cơ sở dữ liệu của bạn trước khi lưu trữ chúng. Thông thường, nó được thực hiện bằng cách phân tích cú pháp tiêu đề giống như tiêu đề tôi đã cung cấp, nhưng tùy thuộc vào trang web bạn thu thập dữ liệu, nó có thể phức tạp. – Sheepy

0

mã sử dụng Bellow

echo "<META http-equiv='Content-Type' content='text/html; charset=UTF-8'>"; 
echo htmlspecialchars_decode($your_string, ENT_QUOTES); 
0

tôi sử dụng cái này rất nhiều

function cleanStr($value){ 
    $value = str_replace('Â', '', $value); 
    $value = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $value); 
    return $value; 
} 
0

Vấn đề này xảy ra khi sử dụng charset khác nhau trong web của bạn.

Để giải quyết này (sử dụng utf-8 trong các ví dụ):

trong <HEAD> trang của bạn thêm charset:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Trong dưới mọi hình thức bạn gửi thêm accept-charset:

<form name="..." method=".." id=".." accept-charset="utf-8"> 

Nếu bạn đang sử dụng php + MySQLi để xử lý biểu mẫu của mình, bạn nên đảm bảo kết nối cơ sở dữ liệu cũng hỗ trợ bộ ký tự của bạn.Thủ tục phong cách:

mysqli_set_charset($link, "utf8"); 

và đối tượng theo định hướng phong cách:

$mysqli->set_charset("utf8") 
2

này làm việc cho tôi:

$string = "Sentence ‘not-critical’ and \n sorting ‘not-critical’ or this \r and some ‘not-critical’ more. ' ! -."; 
$output = preg_replace('/[^(\x20-\x7F)\x0A\x0D]*/','', $string); 
+1

Không hoạt động với Cyrillic –

Các vấn đề liên quan