2010-06-14 35 views
2

我的代碼將大量文本數據傳遞給傳統的lib,它負責存儲它。但是,它傾向於刪除末尾的空白。當我讀回數據時,這是一個問題。 由於我無法更改舊版代碼,因此我想用一些不常見的ASCII字符替換所有空格。當我讀迴文本時,我可以將它們替換回來。安全的ASCII字符在存儲之前替換空白

  1. 這是一個壞主意,考慮到我無法觸摸舊版存儲代碼?
  2. 我可以使用哪個角色作爲替代品?我正在考慮一些180以上的字符。

數據中只有空格 - 沒有選項卡或換行符。 數據是字母數字,帶有特殊字符。

+1

ASCII只能上升到127 :-) – 2010-06-14 12:04:03

回答

0

那麼你可以使用ASCII 254來替換滯後系統中的空間。

+2

ASCII是7位編碼 – 2010-06-14 11:53:43

+0

是的!擴展ASCII只有8位。 :) – 1s2a3n4j5e6e7v 2010-06-14 11:55:45

+0

@ 1s2a3n4j5e6e7v:「擴展ASCII」充其量只是用詞不當。它不涉及任何定義的編碼。 – 2010-06-14 11:57:38

1

如何控制字符(低於32,除了CR/LF/TAB/NULL)?

+0

我個人喜歡☺。 – JAB 2010-06-15 14:15:29

2

您可以使用Tilda(〜)符號。它不會發生在文本中。如果你想逃避它,你可以使用'\'。

1

既然你不能改變遺留代碼,它本質上是一個黑匣子(即使你知道知道發生了什麼)。因此,唯一正確的答案是:嘗試使用哪個角色並使用它。 (如果沒有角色的工作,這個問題是不可能的,這就是遺留代碼很糟糕的原因。)

6

如果你需要保護的是尾部空間(嵌入的空間是好的),那麼把'$'或類似的每個文本的結尾。

然後,您可以在閱讀時簡單地將其刪除。

如果遺留系統中已經有數據,但您可以讀取所有現有數據,以查找任何現有數據末尾從不使用的字符(或字符串),並且用它來標記新的字符串(並保護它們中的空白)。

+0

但是當文本已經開始或以$結尾時會發生什麼? – Steven 2010-06-14 12:42:19

+2

再添加一個。這就像在SMTP中的點填充。 – jdizzle 2010-06-14 12:52:58

+1

或者您可以隨時在存儲時添加$並在閱讀時將其刪除。它與SMTP不同,因爲該字符不用於標記流的結束。 – Amnon 2010-06-14 19:36:33

4

如何使用Base64編碼整個文本?這樣它也可以處理像UTF-8這樣的非ASCII字符集。缺點是你會失去一些空間(如果遺留系統對文本長度有限制)。

+1

+1。這是第一個無損解決方案。 – Steven 2010-06-14 12:30:49

+2

這個解決方案肯定會起作用。這比Leeder的解決方案還要多。 – jdizzle 2010-06-14 12:54:41

1

迄今爲止所有的答案都給出瞭解決方案,一旦您的替換字符已經在您提供的文本中就會破解。無論它是代字號,控制字符還是$都無關緊要。唯一正確的解決方案是在保存文本之前對文本進行編碼,並在檢索文本時進行解碼。

如果找到編碼空間字符的編碼模式,您必須做些什麼。例如,您可以使用URL編碼/解碼,因爲這將編碼空格字符。