Ho una stringa e inizio e lunghezza con cui estrarre una sottostringa. Entrambe le posizioni (inizio e lunghezza) sono basate sugli offset di byte nella stringa UTF8 originale.Estrazione della sottostringa in base alle posizioni utf-8 byte
Tuttavia, c'è un problema:
L'inizio e la durata sono in byte, quindi non posso usare "stringa". La stringa UTF8 contiene diversi caratteri multibyte. C'è un modo iperefficiente per farlo? (Non ho bisogno di decodificare i byte ...)
Esempio: var orig = '? 你 好吗'
I s, e potrebbe essere 3,3 per estrarre il secondo carattere (好). Sto cercando
var result = orig.substringBytes(3,3);
Help!
Aggiornamento n. 1 In C/C++ vorrei solo trasmettere a un array di byte, ma non sono sicuro se c'è un equivalente in javascript. A proposito, sì, potremmo analizzarlo in un array di byte e analizzarlo su una stringa, ma sembra che ci dovrebbe essere un modo rapido per tagliarlo nel posto giusto. Immagina che 'orig' sia 1000000 caratteri, s = 6 byte e l = 3 byte.
Aggiornamento # 2 Grazie a zerkms utile ri-direzione, ho finito con il seguente, che fa NON lavoro giusto - funziona giusto per multibyte ma incasinato per singolo byte.
function substrBytes(str, start, length)
{
var ch, startIx = 0, endIx = 0, re = '';
for (var i = 0; 0 < str.length; i++)
{
startIx = endIx++;
ch = str.charCodeAt(i);
do {
ch = ch >> 8; // a better way may exist to measure ch len
endIx++;
}
while (ch);
if (endIx > start + length)
{
return re;
}
else if (startIx >= start)
{
re += str[i];
}
}
}
Update # 3 non credo che spostando il codice char funziona davvero. Sto leggendo due byte quando la risposta corretta è tre ... in qualche modo lo dimentico sempre. Il punto di codice è lo stesso per UTF8 e UTF16, ma il numero di byte occupati dalla codifica dipende dalla codifica !!! Quindi questo non è il modo giusto per farlo.
L'inizio e la lunghezza di 'substr' sono in carattere, non in byte. – nhahtdh
http://stackoverflow.com/q/1240408/251311 – zerkms
@zerkms - L'ho trovato anch'io, anche se penso che decodificare l'intera stringa in byte, prelevare la sottostringa e tornare indietro sarebbe davvero inefficiente. Cosa succede se ci sono 10000000 caratteri e voglio i byte 6-12? Sembra che la conversione dell'intera stringa sarebbe una pessima idea. – tofutim