2012-01-24 40 views
21

Tôi đang làm việc trên một trang web nơi người dùng có thể chuyển đổi giữa tiếng Anh và tiếng Pháp. Để xuất ngày của bài đăng.php strftime Các ký tự tiếng Pháp

Nếu người dùng chọn Pháp tôi sử dụng:

setlocale(LC_ALL, 'fra_fra'); 

Sau đó, để đầu ra ngày tôi sử dụng:

strftime('%d %B %Y', strtotime($post->post_date)); 

Tôi có charset của tôi tại utf-8 với:

<meta charset="utf-8"> 

Sự cố tôi gặp phải là các ký tự như û và các ký tự khác có dấu trọng âm hiển thị dưới dạng các viên kim cương đen có dấu hỏi.

Có cách nào để sửa lỗi này không?

+0

Bạn có gặp vấn đề này trong nội dung trang nói chung hoặc chỉ trong ngày không? – makriria

+0

Nó chỉ xảy ra trong các ngày. Sử dụng utf8_enocde đã sửa lỗi này – ianckc

Trả lời

45

Đây có vẻ là sự cố/lỗi với chức năng strftime.

Bạn có thể giải quyết nó bằng cách sử:

$date_string = utf8_encode(strftime('%d %B %Y', strtotime($post->post_date))); 
+1

Hoàn hảo! Cảm ơn bạn. – Steffi

+0

Hoàn hảo! Đã khắc phục sự cố của tôi. Đã có dấu trọng âm trong định dạng ngày và phải thêm nó làm mã UTF8. Phải thay đổi: '% e% B% Y à% kh% M' tới: '% e% B% Y & agrave; % kh% M' – onemesh

+1

Vấn đề là 'utf8_encode' trên một chuỗi đã có trong' utf-8' sẽ thu nhỏ các dấu trọng âm hơn. Ngoài ra, 'mb_detect_encoding' báo cáo' F vrier' (nên đọc 'Février') là' utf-8' rồi. –

0

Bạn đã thêm phần này vào tiêu đề chưa?

<meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
+0

Nhiều chức năng về chuỗi không an toàn nhị phân, có tương đương mb_xxxx. Vì vậy, hãy xem xét http://php.net/manual/en/ref.mbstring.php này – makriria

+0

Tôi sẽ đọc qua các hàm mbstring nhờ – ianckc

+0

Với utf-8 một chữ cái là hai byte. Thông thường, ký tự kim cương có dấu chấm hỏi nghĩa là một byte của hai ký tự. – makriria

11

Tiêu đề Loại nội dung cần đặt trang mã thành UTF-8.

header('Content-Type: text/html; charset=UTF-8'); 

Vì bạn không thể thay đổi tiêu đề một khi bạn đã bất cứ điều gì ra để trang với vang hoặc in chắc chắn rằng bạn cài đặt nó vào đầu trang.

Trang mã ASCII được chứa đầy đủ trong UTF-8 chứ không phải ngược lại.

Thay thế tiêu đề UTF-8 bằng ASCII một và bạn sẽ thấy điều gì xảy ra khi các ký tự không được bao gồm trong trang mã hiện tại.

<?php 
header('Content-Type: text/html; charset=UTF-8'); 
//header('Content-Type: text/html; charset=ASCII'); 

$myDate = "Feb 23, 2011"; 

$locale = 'fr_FR.UTF-8'; 
setlocale(LC_ALL, $locale); 
echo strftime('%d %B %Y', strtotime($myDate)); 

$locale = 'en_US.UTF-8'; 
setlocale(LC_ALL, $locale); 
echo strftime('%d %B %Y', strtotime($myDate)); 
?> 
+0

giải thích tốt – konsolenfreddy

+12

'setlocale (LC_ALL, 'fr_FR.UTF8');', và không chỉ ''fr_FR'', đã sửa nó cho tôi. –

1
<?php 
    date_default_timezone_set('Europe/Istanbul'); 
    setlocale(LC_TIME,"turkish"); 
    echo date("d.m.Y").' - '.iconv("ISO-8859-9","UTF-8",strftime('%A')); 
?> 

// 2015/11/06 - Perşembe

1

Nếu bạn hiển thị trang của bạn với mã hóa utf8, bạn muốn nhận được utf8 ra khỏi strftime.

Nếu bộ ký tự của php là utf8, thì bạn đang nấu. Nếu không, bạn có thể:

  • utf8encode() đầu ra của các kỳ nghỉ.

  • append '.utf8' tuyên bố locale của bạn nếu địa phương này được cài đặt trên hệ thống của bạn, như trong charset mặc định setlocale(LC_ALL, 'fr_FR.utf8')

  • thay đổi của php, bằng cách đặt dòng AddDefaultCharset UTF-8 trong php.ini hoặc .htaccess bạn

3

Địa phương có mã hóa khác nhau! Bạn đang quảng cáo trang web của mình bằng cách sử dụng UTF-8, nhưng strftime không trả lại chuỗi được mã hóa UTF-8, bởi vì ngôn ngữ bạn chọn không phải là ngôn ngữ UTF-8. Kiểm tra hệ thống của bạn những gì miền địa phương mà bạn có, ví dụ:

$ locale -a | grep fr_FR 
fr_FR 
fr_FR.ISO8859-1 
fr_FR.ISO8859-15 
fr_FR.UTF-8 

Sau đó chọn biến thể UTF-8 của miền địa phương của bạn, ví dụ:

setlocale(LC_ALL, 'fr_FR.UTF-8'); 

Nếu bạn không có một biến thể UTF-8 của miền địa phương của bạn có sẵn, hoặc tham khảo ý kiến ​​hệ thống trợ giúp của hệ điều hành của bạn làm thế nào để cài đặt nó, hoặc làm một chuyển đổi mã hóa trong PHP.

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