Tengo una cadena codificada en UTF-8 que puede contener kanji de ancho completo, kana de ancho completo, kana de medio ancho, romaji, números o kawaii símbolos japoneses como ★ o ♥.Cálculo de la longitud de una cadena multibyte japonesa con kana de ancho medio en PHP
Si quiero la longitud que uso mb_strlen()
y cuenta cada uno de estos como 1 de longitud. Lo cual está bien para la mayoría de los propósitos.
Pero, un cliente japonés me ha pedido que solo cuente kana de ancho medio como 0.5 (para la longitud máxima de un campo de texto) porque aparentemente así es como lo hacen los sitios web japoneses. Lo hago uso de mb_strwidth()
que cuenta todo lo ancho como 2, y la mitad de ancho que 1, entonces yo simplemente dividir por 2.
Sin embargo, este método también cuenta caracteres romaji como 1 así que algo como Chocアイス
contaría como 7 .. entonces dividiría por 2 para dar cuenta de kanji y obtendría 3.5. pero en realidad quiero 5.5 (4 para el Romaji + 1.5 para los 3 kana de ancho medio).
// EDITAR: algo más de información: cualquier carácter (incluso no kana) que tenga un punto y medio debe ser 1 para el ancho completo y 0.5 para el ancho medio. por ejemplo, personajes como ¥、3@(
todos deben ser 1, pero personajes como ¥,[email protected](
debe ser todo 0,5
// EDITAR EXTRA: símbolos como ☆ y ♥ deben ser 1, pero el/2 método mb_strwidth devolverlos como 0,5
¿Hay alguna manera estándar en que los sistemas japoneses cuenten la longitud de la cadena? ¿O todo el mundo simplemente recorre sus cadenas y cuenta los caracteres que no coinciden con las reglas de ancho estándar?
Mi idea espontánea sería usar 'mb_strlen' como de costumbre y restar el número de ocurrencias de caracteres entre los puntos de código Unicode FF61 y FF9F. Yo podría resolver esto en una respuesta completa después ... – deceze