2015-07-21 69 views
0

EventLog.WriteEntry方法不接受strigs exceding31839分之32766字節 ...截斷字符串(爲特定字節大小)

我想知道如何將字符串截取到的具體數量字節

這裏是我的代碼:

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); 
} 
+3

'ASCIIEncoding.Unicode'似乎有點奇怪... o.O –

+0

* Substring *有什麼問題? – EZI

+0

你註釋掉的那一行有什麼問題:'message.Substring(...'? –

回答

1

你可以試試這個。

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循環將做任何迭代除了某些語言。如果這樣做,它不會很有效率。

對所需字符串長度的初始猜測是將最大長度除以2,因爲大多數UTF16字符都編碼爲兩個字節。有些可能會佔用兩個以上的字節,在這種情況下,消息仍然太長,所以我們必須從最後刪除字符,直到它足夠短爲止。

如果是問題,可以提高效率。

+0

謝謝。由於我的日誌語言是法語,所以也許值得一試... – Serge

+0

法語不包含任何擴展的Unicode字符,因此它應該非常高效,並且如果您保證該郵件不包含任何非西方語言(或非拉丁字符),你可能會刪除'while'循環,因爲它永遠不會做任何事情。 –

+0

所以,字符的最大長度將會是'16000',如果我將有一個包含32000個字符的字符串,我將在while循環中做16000次迭代......即使在英文字符中...... – Serge