在存储前用安全的ASCII字符替换空格

3
我的代码会向一个旧库传递大量文本数据,该库负责存储数据。然而,它往往会移除尾随空格。这在我读取数据时是个问题。 由于我无法更改旧代码,因此考虑将所有空格替换为某些不常见的ASCII字符。当我读回文本时,可以将它们替换回来。
以下是需要回答的问题:
  1. 考虑到我不能触及遗留存储代码,这个想法是否不好?
  2. 我可以使用哪个字符作为替代?我正在考虑使用一些大于180的字符。
在数据中只会有空格 - 没有制表符或换行符。该数据是字母数字型,带有特殊字符。

1
ASCII只能到127 :-) - undefined
7个回答

6

如果您只需要保护尾随空格(嵌入的空格是可以的),那么将'$'或类似字符放在每个文本的末尾怎么样呢。

然后在读取时简单地将其删除即可。

如果遗留系统中已经有数据,则可能会出现问题,但您可以读取所有现有数据,以查找从未在任何现有数据的末尾使用的字符(或字符串),并将其用于标记新字符串(并保护其中的空格)。


2
添加另一个。就像在SMTP中的点填充一样。 - undefined
1
或者您可以在存储时添加一个美元符号,并在读取时将其去除。这与SMTP不同,因为该字符不用于标记流的结束。 - undefined
@Amnon - 这就是我想说的 - 在你放入的每个字符串前加上$,并从你提取的每个字符串中去掉$。 - undefined
我用来替换的一些ASCII字符,像~^,因为它们在书面英语中很少使用! - undefined

4
如何使用Base64编码整个文本?这样它也可以处理像UTF-8这样的非ASCII字符集。缺点是你会失去一些空间(如果遗留系统对文本长度有限制)。

2
这个解决方案肯定能够起作用。只是相比Leeder的解决方案,它有一些额外的开销。 - undefined

2

您可以使用波浪符(~)进行操作。它在文本中很少出现。如果您想要转义,请使用反斜杠(\)。


1

控制字符怎么样(小于32,除了CR/LF/TAB/NULL)?


1

由于您无法更改遗留代码,它本质上是一个黑匣子(即使您在理论上知道发生了什么)。因此,唯一正确的答案是:尝试使用哪个字符有效,并使用该字符。(如果没有字符有效,则问题是不可能解决的。这就是为什么遗留代码很糟糕的原因。)


1
到目前为止,所有的答案都提供了解决方案,但一旦您替换的字符已经在您提供的文本中,这些解决方案就会失效。无论是波浪线、控制字符还是$符号都无关紧要。唯一正确的解决方案是在保存文本之前对其进行编码,在检索时对其进行解码。
如果您找到一个编码模式来编码空格字符,那么您必须执行的操作是什么呢?例如,您可以使用URL编码/解码,因为这将对空格字符进行编码。

0

嗯,你可以使用ASCII 254将空格替换为旧系统。


是的!扩展的ASCII只有8位。 :) - undefined
@1s2a3n4j5e6e7v:"Extended ASCII" 最多只能算是一个误称。它并不指代任何明确定义的编码方式。 - undefined
@1s2a3n4j5e6e7v 正如该网站所说:“下面是最受欢迎的。” - 拉丁1,我想。 - undefined
不是Latin 1 - 我不确定显示的是什么编码,但是Latin 1的字母在序列中稍后出现。 - undefined
是的!维基百科说, 这个术语有时会受到批评,因为它可能被错误地解释为ASCII标准已经更新以包括超过128个字符,或者该术语明确地指代了一个单一的编码,而这两种说法都是不正确的。 - undefined
@1s2a3n4j5e6e7v:我知道那个网站。每当我指出"扩展ASCII"不是单一的编码时,它作为答案出现。然而,它很糟糕。它包含一些非常误导性的陈述,甚至没有提供链接到进一步文档的内容,这可能解决由文本引起的任何误解。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接