2008-09-16 119 views

回答

18

這個'垃圾'看起來很像某人可能反覆將UTF-8數據解釋爲ISO 8859-1或Windows-1252。

â¢是序列C3 A2,E2 82 AC,E2 84 A2。

  • UTF-8 C3 A2 = U + 00E2 = A
  • UTF-8 E2 82 AC = U + 20AC =€
  • UTF-8 E2 84 A2 = U + 2122 =™

我們再次做到這一點:在Windows 1252這個序列是E2 80 99,所以性格應該是U + 2019,右單引號(')

你可以進行多次傳遞使用字節數組,編碼.UTF8和Encoding.GetEncoding(1252)正確轉動垃圾箱ck進入最初輸入的內容。您將需要檢查處理以找到UTF-8數據被錯誤地解釋爲Windows-1252的兩個地方。

0

這些字符的ASCII /整數代碼將超出正常的字母範圍。尋找並替換爲空字符。字符串有一個Replace方法,我相信。

+0

這很容易,但不是我認爲的最佳解決方案。 我需要儘可能最佳(最快)的方式。 :)但感謝您的想法。 – 2008-09-16 14:16:28

1

考慮Regex.Replace(your_string,regex,「」) - 這就是我使用的。

+0

不錯的想法:)我忘了關於正則表達式:) – 2008-09-16 14:17:35

3
"I Don’t see ya..".Replace("’", string.Empty); 

那垃圾怎麼會在那裏得到第一名?這是真正的問題。

+0

「非常有趣」:) – 2008-09-16 14:18:06

1

依次測試每個字符以查看它是否是有效的字母或數字字符,如果不是,則將其從字符串中移除。性格測試非常簡單,只需使用...

char.IsLetterOrDigit; 

請有各種其他如...

char.IsSymbol; 
char.IsControl; 
0

或者使用的東西一個黑名單,你不想要的,或者最好是白名單(設置)。使用白名單遍歷字符串,並只將您的白名單中的字母複製到結果字符串中。你說刪除,你這樣做的方式是有兩個指針一個從(R)讀取和一個你寫(W):

I Donâ₠
    W R 

如果逗號是在白名單中,那麼你會在這種情況下閱讀逗號和寫在哪裏,然後提前兩個指針。 UTF-8是一個多字節編碼,所以你前進的指針可能不只是添加到地址。通過使用預定義函數(或宏)之一,使用C很容易獲得白名單:isalnum,isalpha,isascii,isblank,iscntrl,isdigit,isgraph,islower,isprint,ispunct,isspace,isupper ,isxdigit。在這種情況下,你發送一個白名單功能,而不是一套課程。

通常,當我看到像您這樣的數據時,我會查找內存損壞或證據表明我期望的編碼與輸入數據的編碼不同。

/艾倫

2

這看起來令人不安的熟悉處理Windows字符一個字符編碼集的問題被存儲在使用標準字符編碼數據庫。我看到有人投下威爾,但他有一個觀點。你可能正在解決眼前的問題,但是如果這是問題,那麼角色的組合是無限的。

3

通過刪除任何非拉丁字符,你會故意打破一些國際化的支持。

不要忘記那個名字有個「â」的窮人。

2

如果你真的需要這樣做,正則表達式可能是最好的解決方案。

我強烈建議您考慮一下爲什麼你必須這樣做 - 至少有一些您的列表不符合要求的字符在其他語言中是完全有效且有用的,只是將其過濾出來很可能會引起騷擾至少有一些國際用戶。作爲一個瑞典人,我無法強調足夠多的我討厭系統不能正確處理我們的ä,ä和ö字符。

1

Regex.Replace(「The string」,「[^ a-zA-Z]」,「」);

雖然正則表達式([^ a-zA-Z])應該可以在大多數語言中工作,但您可以在C#中這樣做。

[編輯:忘了正則表達式的空間]

0

如果具有任何垃圾日期字符串,這是很好的辦法刪除這些垃圾日期

string InputString = "This is grate kingdom¢Ã‚¬â"; 
string replace = "’"; 
string OutputString= Regex.Replace(InputString, replace, ""); 

//OutputString having the following result 

它的工作對我好。

0

我在EXIF轉儲中遇到了adobe拋出的外部垃圾問題。我花了一個小時尋找一個直接的答案,並嘗試了許多沒有在這裏工作的一半的建議。

這個線程比我讀過的大多數書中都充斥着深刻的探索性問題,比如「它是如何到達那裏的?」,「如果有人有他們的名字這個字符?」,「你確定你想要打破國際化?」。

有一些令人印象深刻的博客展示了這個垃圾如何在這裏得到並解釋了各種字符編碼方案的演變。這個人想知道如何去除它,而不是它如何成爲什麼樣的標準組織,這些瑣事可能是有趣的。

我寫了一個小程序給了我正確的答案。相反意譯爲主的概念,這裏是整個的,自包含,工作(至少在我的系統)計劃和輸出我用核彈攻擊的垃圾:

#!/usr/local/bin/perl -w 

# This runs in a dos window and shows the char, integer and hex values 
# for the weird chars. Install the HEX values in the REGEXP below until 
# the final test line looks normal. 
$str = 's: “Brian'; # Nuke the 3 werid chars in front of Brian. 
@str = split(//, $str); 
printf("len str '$str' = %d, scalar \@str = %d\n", 
    length $str, scalar @str); 
$ii = -1; 
foreach $c (@str) { 
    $ii++; 
    printf("$ii) char '$c', ord=%03d, hex='%s'\n", 
     ord($c), unpack("H*", $c)); 
} 
# Take the hex characters shown above, plug them into the below regexp 
# until the junk disappears! 
($s2 = $str) =~ s/[\xE2\x80\x9C]//g; # << Insert HEX values HERE 
print("S2=>$s2<\n"); # Final test 

Result: 
M:\new\6s-2014.1031-nef.halloween>nuke_junk.pl 
len str 's: GÇ£Brian' = 11, scalar @str = 11 
0) char 's', ord=115, hex='73' 
1) char ':', ord=058, hex='3a' 
2) char ' ', ord=032, hex='20' 
3) char 'G', ord=226, hex='e2' 
4) char 'Ç', ord=128, hex='80' 
5) char '£', ord=156, hex='9c' 
6) char 'B', ord=066, hex='42' 
7) char 'r', ord=114, hex='72' 
8) char 'i', ord=105, hex='69' 
9) char 'a', ord=097, hex='61' 
10) char 'n', ord=110, hex='6e' 
S2=>s: Brian< 

這是正常的!

另外一個可操作的,工作建議,我跑過: 的iconv -c -t ASCII < 6S-2014.1031-238246.halloween.exf.dif> exf.ascii.dif

相關問題