Ich habe eine Zeichenfolge und Start und Länge, mit der eine Teilzeichenfolge extrahiert werden. Beide Positionen (Start und Länge) basieren auf den Byte-Offsets in der ursprünglichen UTF8-Zeichenfolge.Teilstring durch utf-8 Byte-Positionen extrahieren
Allerdings gibt es ein Problem:
Der Start und die Länge in Bytes sind, so kann ich nicht "substring" verwenden. Die UTF8-Zeichenfolge enthält mehrere Multi-Byte-Zeichen. Gibt es einen hyper-effizienten Weg dies zu tun? (Ich brauche nicht das Bytes zu entschlüsseln ...)
Beispiel: var orig = '? 你 好吗'
Die s, e sein könnte 3,3 das zweite Zeichen zu extrahieren (好). Ich suche nach
var result = orig.substringBytes(3,3);
Hilfe!
Update # 1 In C/C++ würde ich es einfach in ein Byte-Array umwandeln, aber nicht sicher, ob es eine Entsprechung in Javascript gibt. BTW, ja, wir könnten es in ein Bytearray analysieren und es zu einer Zeichenkette zurück analysieren, aber es scheint, dass es einen schnellen Weg geben sollte, es an der richtigen Stelle zu schneiden. Stellen Sie sich vor, dass "orig" 1000000 Zeichen und s = 6 Bytes und l = 3 Bytes ist.
Update # 2 Dank zerkms hilfreich Wieder Richtung, ich mit der folgenden endete, die NICHT Arbeit richtig macht - arbeitet direkt für multibyte aber für einzelne Byte vermasselt.
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 Ich glaube nicht, dass der Code char Verschiebung wirklich funktioniert. Ich lese zwei Bytes, wenn die richtige Antwort drei ist ... irgendwie vergesse ich das immer. Der Codepunkt ist für UTF8 und UTF16 derselbe, aber die Anzahl der Bytes, die beim Codieren benötigt werden, hängt von der Codierung ab !!! Das ist also nicht der richtige Weg.
Der Start und die Länge für 'substr' sind im Zeichen, nicht Bytes. – nhahtdh
http://stackoverflow.com/q/1240408/251311 – zerkms
@zerkms - Ich fand das auch, obwohl ich denke, dass das Dekodieren der ganzen Zeichenfolge zu Bytes, das Abgreifen des Teilstrings und das Zurückgehen wirklich ineffizient wäre. Was ist, wenn es 10000000 Zeichen gibt und ich Bytes 6-12 möchte? Scheint, dass das Umwandeln der ganzen Schnur eine schreckliche Idee wäre. – tofutim