什么定义了可以存储在字符串中的数据

时间:2008-11-02 11:52:28

标签: string character

几天前,我问why its not possible to store binary data, such as a jpg file into a string variable

我得到的大多数答案都说字符串用于文本信息,例如我现在正在写的内容。

什么是文本数据呢?某种性质的字节表示jpg文件,这些字节可以用字符字节值表示......我想。因此,当我们说字符串是用于文本信息时,是否存在某种范围或未存储的字符列表?

对不起,如果这个问题听起来很愚蠢。只是想'得到它'

9 个答案:

答案 0 :(得分:2)

我发现将二进制数据存储在字符串中存在三个主要问题:

  1. 大多数系统在字符串变量中假定某种编码 - 例如如果它是UTF-8,UTF-16或ASCII字符串。新行字符也可能会根据您的系统进行翻译。
  2. 你应该注意字符串大小的限制。
  3. 如果使用C样式字符串,则数据中的每个空字符都将终止字符串,并且执行的任何字符串操作仅适用于第一个空字节的字节。
  4. 也许是最重要的:它令人困惑 - 其他开发人员不希望在字符串变量中找到随机二进制数据。在遇到二进制数据时,许多上运行的代码也可能会变得非常困惑:)

答案 1 :(得分:2)

我更希望将二进制数据存储为二进制数据,你只考虑在没有其他选择的情况下将其转换为文本,因为当你将它转换为文本表示时,它确实浪费了一些字节(不多,但仍然很重要) ,这就是他们如何将附件放入电子邮件中。

Base64是二进制文件的良好文本表示。

答案 2 :(得分:1)

我认为你指的是binary to text encoding issue。 (将jpg翻译成字符串将需要那种预处理)

事实上,在那篇文章中,一些字符被提及并不总是受支持,其他字符可能会令人困惑:

  

有些系统可以处理更有限的字符集;它们不仅不是8位清洁,有些甚至无法处理每个可打印的ASCII字符   其他人对换行符之间可能出现的字符数有限制   还有一些人在文本中添加标题或预告片。

     

一些未被充分考虑但仍在使用的协议使用带内信令,如果消息中出现特定模式,则会造成混淆。最着名的是用于分隔mbox文件格式的邮件消息的行开头的字符串“From”(包括尾随空格)。

答案 3 :(得分:1)

谁告诉你你不能把'二进制'数据放入字符串中是错误的。字符串只是表示您最有可能计划用于文本数据的字节数组......但没有什么可以阻止您将任何数据放在您想要的位置。

我必须要小心,因为我不知道你使用的语言是什么......在某些语言中\ 0结束了字符串。

在C#中,您可以将任何数据放入字符串中......例如:

byte[] myJpegByteArray = GetBytesFromSomeImage();

string myString = Encoding.ASCII.GetString(myJpegByteArray);

答案 4 :(得分:1)

在国际化之前,它并没有太大的区别。 ASCII字符都是字节,因此字符串,字符数组和字节数组最终具有相同的实现。

但是,现在,字符串要复杂得多,以便处理成千上万的外语字符以及随之而来的语言规则。

当然,如果你看得够深,一切都只是比特和字节,但是计算机如何解释它们的世界各不相同。 “文本”的规则使事物在向人类显示时看起来正确,但计算机可以自由地使用内部表示。例如,

答案 5 :(得分:0)

取决于语言。例如,在Python中,字符串类型(str)实际上是字节数组,因此它们确实可以用于二进制数据。

在C中,NULL字节用于字符串终止,因此sting不能用于任意二进制数据,因为二进制数据可能包含空字节。

在C#中,字符串是一个字符数组,由于char基本上是16bit int的别名,因此您可以放弃将任意二进制数据存储在字符串中。当您尝试显示字符串时可能会出错(因为某些值可能实际上不对应于合法的unicode字符),并且某些操作(如大小写转换)可能会以奇怪的方式失败。

简而言之,在某些语言中可能有可能将任意二进制数据存储在字符串中,但它们并非设计用于此用途,并且您可能会遇到各种不可预见的问题。大多数语言都有一个字节数组类型,用于存储任意二进制数据。

答案 6 :(得分:0)

内心深处一切都只是字节。 像字符串和图片之类的东西是由关于如何排序字节的规则定义的。 例如,字符串以值为32(或其他)的字节结尾 jpg没有

答案 7 :(得分:0)

我同意Jacobus'回答: 最后,所有数据结构都由字节组成。 (好吧,如果你走得更深:比特)。通过一些抽象,你可以说字符串或字节数组是程序员的惯例,关于如何访问它们。

在这方面,字符串是解释为文本的数据的抽象。文本是为人类之间的通信而发明的,计算机或程序使用文本进行的通信不是很好。 SQL是文本的,但它是人类告诉数据库做什么的接口。

因此,一般而言,文本数据以及字符串主要用于人与人之间,或人与机之间的交互(比如消息框的内容)。将它们用于其他东西(例如,读取或写入二进制图像数据)是可能的,但是由于您正在使用数据类型来处理其未设计的内容,因此会带来很多风险。这使得它更容易出错。你可能能够将二进制数据存储在字符串中,但是因为你能够用脚射击自己,你应该避免这样做。

总结:你可以做到。但你最好不要这样做。

答案 8 :(得分:0)

您的原始问题(c# - What is string really good for?)没有多大意义。所以答案也没有意义。

您的原始问题说“但出于某种原因,当我将此字符串写入文件时,它不会打开。”这并不意味着什么。

您的原始问题不完整,答案令人误解和混淆。您可以在String中存储任何内容。期。那里的“字符串是用于文本”的答案是因为你没有在你的问题中提供足够的信息来确定你的特定C#代码有什么问题。

您没有提供代码段或错误消息。这就是为什么它很难“得到它” - 你没有提供足够的细节让我们知道你没有得到什么。