/ / Tratar con cadenas no-ascii como matriz y carácter - php, cadena

Tratar con cadenas no-ascii como matriz y carácter - php, cadena

Estoy tratando de escribir la función para hacer la number_format() Trabajo para los números no ascii, específicamente los números persoárabes.

Primero tengo que intercambiar los números que me dejan con una cadena de caracteres no-ascii:

$n = 133;
$n = exchange($n);
echo $n ;
//result : ١٣٣

El problema es que cuando agrego las comas al número o más bien a la cadena, mi resultado final viene con algunos caracteres .

Aquí está la función que utilizo para agregar las comas:

    static public function addcomma($number)
{

$i = strlen($number)-1;
$c = 0 ;

for($i ; $i >= 0 ; $i--){
$c++;

if($c == 1 )
$y =mb_substr($number, $i, 1);
else
$y .= mb_substr($number, $i, 1);



if($c%3 == 0 && $i != 0 )
$y .=",";
}
$y = strrev($y);
return $y;

}

Y este es el resultado para $n = ١٣٣:

,٣ , ١

Respuestas

3 para la respuesta № 1

Algunos de sus caracteres (probablemente todos) se almacenan en más de un byte, desvinculan cadenas ASCII regulares. Así que tienes que usar funciones de cadena multibyte Manipular las cuerdas. No puedes usar strlen, substr y strrev (o cualquier otra función de cadena normal), y no puede simplemente tratar la cadena como una matriz. Por lo tanto, tiene que cambiar algunas secciones de su código, como esto:

$i = mb_strlen($number)-1;
// (...)
$y = mb_substr($number, $i, 1);

No hay equivalente multibyte para strrev, así que puedes probar esto (sugerido en un comentario en el strrev página de manual):

// strrev won"t work
// $y = strrev($y);
$y = join("", array_reverse(preg_split("//u", $y)));

Lo anterior dividirá la cadena en una matriz, respetando los límites multibyte (tenga en cuenta la u al final de la expresión regular, invierta esa matriz y luego únala de nuevo a una cadena.


3 para la respuesta № 2

Su cadena árabe (es decir, lo que obtenga de exchange()) es muy probable que esté codificado en utf-8, o básicamenteAlgunos formatos no de 8 bits. Tan pronto como comienza a jugar con la cadena como una matriz (que PHP asume que es de 8 bits), rompe la cadena utf-8 y sale con esos signos de interrogación graciosos cuando se imprime en la pantalla (que por el De esta manera, asegúrese de que el tipo de codificación de su documento esté configurado también en utf-8).

Dependiendo de la versión de PHP, necesitarás usar las funciones mb_string para jugar con cadenas de múltiples bytes, que es lo que tienes.