截断字符串(到特定的字节大小)

Truncate a string (to a specific bytes size)

EventLog.WriteEntry 方法不接受超过 32766 / 31839 bytes...

的字符串

我想知道如何将字符串截断到特定的 字节数

这是我的代码:

public static void Log(string message)
{
    const int MaxLogMessageLenght = 32766;

    string logMessage = message;
    var unicodeByteCount = 
            System.Text.ASCIIEncoding.Unicode.GetByteCount(logMessage);
    var asciiByteCount = 
            System.Text.ASCIIEncoding.ASCII.GetByteCount(logMessage);

    if (unicodeByteCount >= MaxLogMessageLenght)
    {
        // ????
        // Truncate the string to fit the WriteEntry length
        // logMessage = message.Substring(0, MaxLogMessageLenght - 5) + "...";
    }
    EventLog.WriteEntry(LogSource, logMessage, EventLogEntryType.Information);
}

你可以试试这个。

const int MaxLogMessageLength = 31839 ;

int n = Encoding.Unicode.GetByteCount(message);

if (n > MaxLogMessageLength)
{
    message = message.Substring(0, MaxLogMessageLength/2); // Most UTF16 chars are 2 bytes.

    while (Encoding.Unicode.GetByteCount(message) > MaxLogMessageLength)
        message = message.Substring(0, message.Length-1);
}

while 循环不太可能必须执行任何迭代,但某些语言除外。如果是这样,效率就不会很高。

对所需字符串长度的初步猜测是将最大长度除以二,因为大多数 UTF16 字符被编码为两个字节。有些可能需要两个以上的字节,在这种情况下,消息仍然太长,所以我们必须从末尾删除字符,直到足够短。

如果这是一个问题,您可以提高效率。