2012-08-24 84 views
7

Tôi hiện đang làm việc trên một ứng dụng để lấy dữ liệu JSON từ API cộng đồng blizzard và phân tích nó bằng PHP. Mọi thứ đều ổn cho đến khi tôi đến một nhân vật với một nhân vật đặc biệt trong tên của họ.Ký tự đặc biệt & Viết lại URL

Để lấy dữ liệu ký tự, tôi cần biết tên nhân vật và lĩnh vực mà họ đang sử dụng.

Tôi có tên và lĩnh vực được chuyển qua URL tới trang ký tự và từ đó sử dụng thông tin đó để lấy dữ liệu ký tự.

Tại thời điểm này các URL của tôi là như vậy:

http://localhost/guildtree/characters.php?realm=argent-dawn&name=Ankzu 

Tại thời điểm này nếu tôi cố gắng để kéo dữ liệu cho một nhân vật với một giọng tôi nhận được lại dẫn đến trang lỗi của tôi vì nó không phải là một giá trị tính cách.

Cho đến khi tôi bắt đầu viết lại URL, tôi đã phát hiện thấy sự cố của mình. Tôi đang được chuyển hướng đến trang lỗi của tôi bởi vì một nơi nào đó dọc theo dòng các ký tự đặc biệt đang được thay thế cho một số nhân vật thực sự đáng kinh ngạc.

Với URL mới viết lại của tôi sau hoạt động:

http://localhost/guildtree/argent-dawn/ankzu 

Tuy nhiên, một nhân vật với một nhân vật đặc biệt trong kết quả tên của họ trong một thông báo lỗi.

http://localhost/guildtree/argent-dawn/notúk 

Kết quả trong thông báo lỗi sau:

"Not Found

Các yêu cầu URL/guildtree/argent bình minh/notúk không tìm thấy trên máy chủ này"

Như bạn có thể thấy ú đang được thay thế cho áº, nhưng khi tôi sao chép và dán URL ú xuất hiện như% C3% BA

Đó là sự hiểu biết của tôi rằng lý do tại sao ú đang xuất hiện như Ạlà vì hai byte unicode ú đang được phân tích thành hai ký tự ASCII một byte dẫn đến ú được hiển thị.

tôi đã đảm bảo rằng tất cả các trang của tôi có như sau trong tiêu đề:

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

Để cho ứng dụng của tôi hoạt động tốt tôi cần những ký tự đặc biệt để hiển thị đúng, vì vậy tôi cần ú để thực sự hiển thị như ú, không xuất hiện như ú nhưng thực ra là ú hoặc% C3% BA.

Tên nhân vật đã được kéo từ URL đơn giản là:

$charName = $_GET['name']; 

Có thể mã hóa $ charName để hiển thị các ký tự đặc biệt đúng?

Tôi đã thử mọi thứ tôi có thể nghĩ đến và đã tìm kiếm trên Google nhưng không có gì có hiệu quả.

Ngoài ra, vì tôi đang sử dụng URL viết lại quy tắc viết lại sẽ cho phép những ký tự đặc biệt này là gì?

Đây là quy tắc viết lại hiện tại của tôi:

RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$  characters.php?realm=$1&name=$2  [NC] 

Tôi biết rằng ([a-zA-Z] +) không cho phép ở tất cả các ký tự đặc biệt, tôi vẫn đang được làm việc trên nhận được các ký tự đặc biệt để hiển thị chính xác. Nếu tôi sử dụng ([a-zA-Z \ ú] +) nó sẽ hoạt động và hiển thị trang vì nó cần được hiển thị. Việc thêm \ ú vào quy tắc có vẻ như một cách rất kém để thực hiện việc này và không phải lúc nào cũng hoạt động khi sử dụng ký tự tương ứng cho các ký tự có dấu trọng âm.

Mọi trợ giúp sẽ được đánh giá cao. Nếu bạn cần thêm thông tin, vui lòng hỏi.

Edit:

Thay đổi quy tắc viết lại của tôi vào bên dưới cho phép thông tin được kéo tốt, nhưng tạo ra một vòng lặp chuyển hướng cho CSS của tôi.

RewriteRule ^([a-zA-Z0-9_'-]+)/([^/]+)$  characters.php?realm=$1&name=$2 [NC] 

Ví dụ CSS của tôi đang được chuyển hướng đến

http://localhost/guildtree/css/error 

thay vì

http://localhost/guildtree/css/style2.css 

Cập nhật:

Qua một vài bài kiểm tra đơn giản:

$charName = $_GET['name']; 
$charNameTEST = utf8_encode($charName); 

sẽ thực hiện thay đổi, nhưng khi tôi áp dụng này vào trang của tôi nó vẫn đi lên nói:

"Not Found

đã yêu cầu URL/guildtree/argent bình minh/notúk không tìm thấy trên máy chủ này . "

Tôi nghĩ vấn đề chính hiện nay là chuyển hướng URL, vì dữ liệu JSON có thể được phân tích cú pháp hoàn toàn tốt khi có các ký tự có dấu trọng âm. Tôi chỉ không hiểu lý do tại sao nó vẫn cho tôi thấy rằng nó nằm trên guildtree/argent-dawn/notúk trong thanh trình duyệt, nhưng vẫn cố gắng kéo lên/guildtree/argent-dawn/notúk.

Trả lời

3

ú không phải là ký tự hợp lệ đối với URL.

Bất cứ nơi nào bạn liên kết tên người dùng, bạn nên mã hóa URL đó.

Do đó URL đúng để trỏ đến là:

http://localhost/guildtree/argent-dawn/not%C3%BAk 

Bạn nên in nó trong php như:

echo '<a href="http://localhost/guildtree/argent-dawn/'. urlencode($name) .'">Link</a>; 
+0

Điều gì sẽ xảy ra khi ai đó nhập URL trực tiếp? – akari

+0

Bạn cũng có thể muốn xem xét ASCIIfying tên người dùng. 'example.com/guildtree/argent-dawn/notuk /' thay vì 'example.com/guildtree/argent-dawn/không phải% C3% BAk'. Người dùng của bạn có thể sẽ dễ dàng hơn. Ví dụ: –

+0

example.com/guildtree/argent-dawn/notuk và example.com/guildtree/argent-dawn/notúk sẽ lấy hai tập dữ liệu hoàn toàn khác nhau, tên nhân vật phải chính xác. – akari

2

Tôi nghĩ this question có thể có câu trả lời của bạn. Tôi có không cố gắng này bản thân mình, nhưng từ những gì tôi có thể thấy, bạn cần phải viết lại RewriteRule của bạn như:

RewriteRule ^([a-zA-Z0-9_'-]+)/([a-zA-Z]+)$  characters.php?realm=$1&name=$2  [NC,B] 

Các B cờ sẽ đảm bảo rằng các ký tự đặc biệt là URL thoát, vì vậy giá trị nhìn thấy bằng tên trong $ 2 sẽ được mã hóa phần trăm. Vì bạn không thực hiện chuyển hướng, ký tự unicode ban đầu sẽ vẫn là những gì được hiển thị trong URL.

Bạn cũng sẽ cần một số thay đổi đối với regex để đảm bảo nó thay đổi các ký tự unicode. Tôi không chắc đó là những gì.

Ngoài ra còn có một số mô tả khác về cách unicode characters work in URLs over here.

+0

Tôi đã gắn nó, nhưng nó đang tạo ra một lỗi máy chủ nội bộ. Chỉnh sửa: có lỗi đánh máy, không có lỗi nội bộ, nhưng vẫn không hoạt động. – akari

2

Để làm điều này hoạt động bình thường, bạn cần phải làm hai việc.

Thứ nhất thêm video này vào .htaccess của bạn

AddDefaultCharset On 
AddDefaultCharset UTF-8 
AddCharset UTF-8 .tpl 
AddCharset UTF-8 .js 
AddCharset UTF-8 .css 
AddCharset UTF-8 .php 

Thứ hai thay đổi một phần của quy tắc viết lại của bạn mà cần phải cho phép các ký tự đặc biệt để như vậy (. *):

RewriteRule ^([a-zA-Z0-9_'-]+)/(.*)$  characters.php?realm=$1&name=$2  [NC] 

chí này gây ra một số vòng chuyển hướng cho các trang khác, nhưng tôi đang cố gắng khắc phục hiện tại.

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