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.
Điều gì sẽ xảy ra khi ai đó nhập URL trực tiếp? – akari
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ụ: –
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