Mam ciąg i początek oraz długość, z której wyodrębni się podciąg. Obie pozycje (początek i długość) są oparte na przesunięciach bajtów w oryginalnym łańcuchu UTF8.Wyciąganie podłańcuchów według utf-8 pozycji bajtowych
Istnieje jednak pewien problem:
rozpoczęcia i długość są w bajtach, więc nie mogę użyć „podciąg”. Ciąg znaków UTF8 zawiera kilka znaków wielobajtowych. Czy istnieje nadproduktywny sposób robienia tego? (Nie ma potrzeby dekodowania bajtów ...)
przykład: var oryg = '你 好吗'
S, e może być od 3,3 do ekstrakcji drugi znak (好). Szukam pomocy:
var result = orig.substringBytes(3,3);
Pomoc!
Aktualizacja # 1 W C/C++ po prostu rzuciłbym to do tablicy bajtów, ale nie jestem pewien, czy istnieje odpowiednik w javascript. BTW, tak, moglibyśmy przetworzyć go na tablicę bajtów i przetworzyć z powrotem na ciąg znaków, ale wydaje się, że powinien być szybki sposób na wycięcie go we właściwym miejscu. Wyobraź sobie, że "orig" to 1000000 znaków, s = 6 bajtów i l = 3 bajty.
Aktualizacja # 2 Dzięki zerkms pomocny przekierowania, skończyło się z następujących, które dokłada NIE prawo działać - działa prawo wielobajtowych ale zawiedli się na jeden bajt.
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];
}
}
}
Aktualizacja # 3 Nie sądzę przesuwanie kod char naprawdę działa. Czytam dwa bajty, gdy poprawna odpowiedź to trzy ... jakoś zawsze o tym zapominam. Punkt kodowy jest taki sam dla UTF8 i UTF16, ale liczba bajtów wziętych na kodowanie zależy od kodowania !!! Tak więc nie jest to właściwy sposób.
Początek i długość 'substr' mają charakter, a nie bajty. – nhahtdh
http://stackoverflow.com/q/1240408/251311 – zerkms
@zerkms - Znalazłem to również, chociaż myślę, że dekodowanie całego ciągu znaków na bajty, wybranie podłańcucha i cofnięcie byłoby naprawdę nieefektywne. Co jeśli jest 10000000 znaków i chcę bajty 6-12? Wydaje się, że konwersja całego ciągu znaków byłaby okropnym pomysłem. – tofutim