Hàm idn_to_ascii() trong PHP chuyển đổi tên miền Unicode sang dạng IDNA ASCII. IDNA = Internationalizing Domain Names in Applications – cơ chế xử lý tên miền quốc tế chứa ký tự non-ASCII.
Cú pháp
string idn_to_ascii(
string $domain,
int $flags = IDNA_DEFAULT,
int $variant = INTL_IDNA_VARIANT_UTS46,
array &$idna_info = null
)
Tham số
| Tham số | Mô tả |
|---|---|
$domain |
Tên miền cần chuyển đổi. Phải là UTF-8. |
$flags |
Kết hợp các hằng IDNA_* (ví dụ: IDNA_NONTRANSITIONAL_TO_ASCII, IDNA_CHECK_BIDI). |
$variant |
INTL_IDNA_VARIANT_2003 (IDNA 2003, deprecated) hoặc INTL_IDNA_VARIANT_UTS46 (UTS#46, khuyên dùng). |
$idna_info |
Chỉ dùng khi $variant = INTL_IDNA_VARIANT_UTS46. Trả về mảng info: result, is_transitional_different, errors. |
Giá trị trả về
Tên miền dạng ASCII-compatible (A-label, dạng xn--...) nếu thành công, false nếu thất bại.
Ví dụ 1: Chuyển đổi cơ bản
<?php
echo idn_to_ascii('täst.de', 0);
// Output: xn--tst-qla.de
?>
Ví dụ 2: UTF-8 encoding & trường hợp đặc biệt
<?php
// Chuyển đổi từ UTF-8
echo idn_to_ascii(utf8_encode('täst.de'));
// Output: xn--tst-qla.de
// Tên miền đã là A-label (bắt đầu xn--) chứa non-ASCII → không chuyển được
$ascii = idn_to_ascii("xn--" . chr(0xC3) . chr(0xA4));
print_r($ascii);
// Output: xn--tst-fea82a.de (hoặc false tùy phiên bản ICU)
?>
Lưu ý
- Cần extension
intl(ICU). - PHP 7.2+ khuyên dùng
INTL_IDNA_VARIANT_UTS46(mặc định). - IDNA 2003 (
INTL_IDNA_VARIANT_2003) đã deprecated từ PHP 7.2, xóa từ PHP 8.0.