tôi có chức năng sau đây từ trang php.net để xác định # byte trong một ASCII và UTF-8 chuỗi:Làm cách nào để tìm số byte trong chuỗi UTF-8 bằng PHP?
<?php
/**
* Count the number of bytes of a given string.
* Input string is expected to be ASCII or UTF-8 encoded.
* Warning: the function doesn't return the number of chars
* in the string, but the number of bytes.
*
* @param string $str The string to compute number of bytes
*
* @return The length in bytes of the given string.
*/
function strBytes($str)
{
// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
// Number of characters in string
$strlen_var = strlen($str);
// string bytes counter
$d = 0;
/*
* Iterate over every character in the string,
* escaping with a slash or encoding to UTF-8 where necessary
*/
for ($c = 0; $c < $strlen_var; ++$c) {
$ord_var_c = ord($str{$d});
switch (true) {
case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
// characters U-00000000 - U-0000007F (same as ASCII)
$d++;
break;
case (($ord_var_c & 0xE0) == 0xC0):
// characters U-00000080 - U-000007FF, mask 110XXXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$d+=2;
break;
case (($ord_var_c & 0xF0) == 0xE0):
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$d+=3;
break;
case (($ord_var_c & 0xF8) == 0xF0):
// characters U-00010000 - U-001FFFFF, mask 11110XXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$d+=4;
break;
case (($ord_var_c & 0xFC) == 0xF8):
// characters U-00200000 - U-03FFFFFF, mask 111110XX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$d+=5;
break;
case (($ord_var_c & 0xFE) == 0xFC):
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$d+=6;
break;
default:
$d++;
}
}
return $d;
}
?>
Tuy nhiên khi tôi thử điều này với Nga (ví dụ По своей природе компьютеры могут работать лишь с числами. И для того, чтобы они могли хранить в памяти буквы или другие символы, каждому такому символу должно быть поставлено в соответствие число.
). Nó dường như không trả về số byte đúng.
Tuyên bố chuyển đổi đang sử dụng điều kiện mặc định. Bất kỳ ý tưởng nào tại sao các nhân vật Nga sẽ không hoạt động như mong đợi? Hoặc sẽ có lựa chọn tốt hơn cho việc này.
Tôi yêu cầu điều này vì tôi cần phải rút ngắn chuỗi UTF-8 thành một số byte nhất định. tức là tôi chỉ có thể gửi giá thầu CPC trong số 169 byte dữ liệu JSON tới APNS của iPhone trong tình huống của tôi (không bao gồm dữ liệu gói khác).
tham khảo: PHP strlen - Manual (Paolo Comment on 10-Jan-2007 03:58)
chuyển đổi (đúng)? Đó là một cách kỳ lạ để làm việc .. –
Chức năng là từ các bình luận trong tài liệu tham khảo ở dưới cùng của bài viết. Tôi đã không mã nó :) Tuy nhiên có vẻ như nó là đúng quá trình chứ không phải là sử dụng mb_strlen, ngoài các ký tự tiếng Nga không làm việc. – Luke
@Brendan Tôi chỉ đang nghĩ như vậy. – alex