Есть ли способ определить длину строки в кодировке UTF-8 в байтах в C #? - PullRequest
4 голосов
/ 23 июля 2011

Я хотел посмотреть, есть ли способ определить размер (по размеру файла) строки в .NET.Представьте, что у вас есть текстовое предложение, и принимающая система должна ограничить размер получаемого текста.

Можно ли определить размер строки в байтах или килобайтах строки или прочитать только первые N байтов или килобайт строки в кодировке UTF-8?

string testSentence = "I onlyхотите первые 2 КБ этого предложения. Можно ли разделить его на фрагменты по 2 КБ, чтобы я мог выполнить цикл и отправлять 2 КБ одновременно другому процессу? "

Ответы [ 3 ]

3 голосов
/ 23 июля 2011

Вы можете преобразовать строку в байты, используя Encoding.UTF8.GetBytes.Затем разбейте байты на 2048 кусков.Будьте осторожны, чтобы не разделить один символ на две части.

byte[] bytes = Encoding.UTF8.GetBytes(testSentence);

int pos = 0;
int length = bytes.Length;

while (length > 0)
{
    int count = 2048;

    if (count >= length) // last chunk
    {
        // send chunk
        Send(bytes, pos, length);
        pos += length;
        length -= length;
    }
    else // not last chunk
    {
        // chop off last character
        while ((bytes[pos + count - 1] & 0xC0) == 0x80) count--;
        count--;
        // send chunk
        Send(bytes, pos, count);
        pos += count;
        length -= count;
    }
}

(не проверено)

0 голосов
/ 23 июля 2011

Я думаю, что что-то похожее на следующее обеспечит то, что вы ищете ..

byte[] data = System.Text.Encoding.UTF8.GetBytes(theString).Take(2048).ToArray();

или

byte[] source = System.Text.Encoding.UTF8.GetBytes(theString);
byte[] destination = new byte[2048];
Buffer.BlockCopy(source, 0, destination, 0, 2048);

Редактировать: добавлен пример для комментария ..

Это обеспечит вас List<byte[]> кусками по 2 КБ, стоит отметить, что это написано не для эффективности, а в качестве примера, хотя оно выполнит работу, не настроенную на высокую производительность.

string theString = new string('*', 1022574);

byte[] allData = System.Text.Encoding.UTF8.GetBytes(theString);
int numberOfChunks = (int)Math.Ceiling((double)(allData.Length) / 2048);
List<byte[]> chunks = new List<byte[]>(numberOfChunks);

for (int i = 0; i < numberOfChunks; i++) {
    chunks.Add(allData.Skip(i * 2048).Take(2048).ToArray());
}
0 голосов
/ 23 июля 2011

Используйте метод System.Text.Encoding.UTF8.GetByteCount ().

(Ответ отредактирован.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...