- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一段代码将字符串转换成内存流:
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(applicationForm)))
但是如果它是正确的,我有点困惑。基本上我总是对 .NET 编码感到困惑。
底线:我是否使用正确的编码对象 (UTF8) 来获取字节?
我知道 .NET 在内部将字符串存储为 UTF-16,但我的 applicationForm 变量基于包含以 UTF-8 格式保存的文本的文件 编码。
谢谢,帕维尔
编辑 1:让我们确切地解释一下我是如何获得 applicationForm 变量的。我确实可以访问使用 GenerateApplicationForm 方法公开类的程序集。该方法返回字符串。但是我知道,在幕后的某个地方,组件使用存储在驱动器上的文件。这些文件的内容使用 UTF-8 编码。所以我不能直接读取文件等。我只有那个字符串,而且我知道,最初使用的是 UTF-8 编码文件。在使用 GenerateApplicationForm 组件的客户端代码中,我必须将 applicationForm 变量转换为流,因为其他组件(来自另一个程序集)需要一个 Stream 。这就是问题中提到的 using.... 语句开始起作用的地方。
最佳答案
假设 applicationForm
是您从某个 UTF8
文本文件中读取的字符串。它将是 UTF16
/Unicode
,无论源文件的编码如何。当您将文件加载到字符串中时发生转换。
您的代码会将 applicationForm
字符串编码为 UTF8
字节的 MemoryStream
。
这可能正确也可能不正确,具体取决于您要用它做什么。
.Net 字符串总是 UTF16
或 Unicode
。当 Strings
被转换为文件、流或 byte[]
时,它们可以用不同的方式编码。 1 个字节不足以存储所有语言中使用的所有不同字符,因此需要对更复杂的字符串进行编码,以便一个字符可以用多个字节表示,有时或总是取决于所使用的编码。
如果您使用像 ASCII
这样的简单编码,一个字符将始终由一个字节组成,但数据将被限制在 ASCII
字符集中。如果使用任何多字节字符,从任何 UTF 编码转换为“ASCII”可能会丢失数据。
完整图片在unicode go here .
编辑 1:除非有关 GenerateApplicationForm 组件的更多信息,否则编码 UTF8
可能是正确的选择。如果这不起作用,请尝试 ASCII
或 UTF16
。最重要的是,请查阅组件源代码或咨询组件提供商。
编辑 2:绝对是 UTF8
那么,您一直都是对的。
关于c# - 来自字符串的 MemoryStream - 关于要使用的编码的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6188131/
我有一个返回 MemoryStream? 的函数。如果发生错误,则为 null。然后发现不能声明变量MemoryStream? public MemoryStream? GetResponseStre
我正在将一个结构序列化到 MemoryStream 中,我想保存和加载序列化的结构。 那么,如何将 MemoryStream 保存到文件中并从文件中加载它呢? 最佳答案 您可以使用MemoryStre
我应该调用哪个? 有必要两者都调用吗? 如果我已经调用了其中一个,另一个会抛出异常吗? 最佳答案 Close() 和 Dispose() 在 MemoryStream 上调用时,仅用于做两件事: 将对
今天我注意到 MemoryStream 有点奇怪类(class)。 .Length属性是一个 long,但是 .Capacity属性,大概应该总是 >= .Length 只是一个 int。 我知道需要
我有这样的方法: public DataObject GetClipboardData() { var result = new DataObject(); result.SetTex
好的,我看过一些文章here和 here ,但他们没有做我需要做的事情,我遇到了一些麻烦。 我正在接收一段作为内存流的加密数据。我需要以某种方式将内存流写入文件(我编写模型的方式,最好是字符串),然后
我确实看到了“PDF to Image using GhostScript. No image file has to be created”,但这只是(某种程度上)回答了我一半的问题。是否可以使用
这个问题在这里已经有了答案: Stream.Seek(0, SeekOrigin.Begin) or Position = 0 (3 个答案) 关闭 9 年前。 使用的优点或缺点是什么(或区别) m
我在一些开源代码中发现了以下结构: var mstream = new MemoryStream(); // ... write some data to mstream mstream.Close(
由于 MemoryStream 是非托管资源,它是否总是需要被处理? 鉴于: 1) A method is invoked. 2) A MemoryStream object is created (
我正在尝试使用 dotMemory 进行一个简单的测试。我希望以下测试能够通过: [Test] public void MemoryStream_is_disposed() { using (
多次使用 MemoryStream 时遇到问题。 例子: For Each XImage As XImage In pdfDocument.Pages(pageCount).Resources.Ima
在使用 MemoryStream 时,我发现自己经常将数据复制(因此复制)到临时字节数组。 我认为这有点浪费资源,因为 MemoryStream 不允许您直接访问底层字节数组。 在这种情况下,Memo
如何在 Delphi 中将“Hello World”字符串、clrf 和一些随机 10 个字节写入内存流? 最佳答案 我会考虑使用二进制编写器来完成此任务。这是一个更高级别的类,负责处理将数据获取到流
我正在使用 MemoryStream 构造一个需要发送到服务器的字节数组。我有三个问题: 1) 有没有比这更好的方法来构造字节数组? 2)为什么这段代码会在我的内存流中写入虚假内容? var se
这可能是一个非常简单的问题,我认为我所追求的只是声明新 MemoryStream 的最佳实践 以下2个样本有什么区别: MemoryStream myStream = new MemoryStream
我正在尝试压缩 XML 树并将其用作电子邮件附件。带附件的电子邮件发送成功,但创建的 zip 文件始终损坏 - 它不是有效的 zip 文件,但包含二进制数据。 问题重现如下,具体参见BuildAtta
使用sharpPDF库,我生成了一个pdf内存流,并且我想直接通过电子邮件发送它。但是 ms.Seek(.... 行给出了一个 ObjectDisposeException; Cannot acces
我有一台 2 GB 的机器。在运行我的 exe 之前,我有 1.1 GB 的可用内存。当我运行下面只有一行的 exe 时,出现内存不足异常。 我预计以下行将使用大约 6 亿字节。 MemoryStre
当您从字节数组构造 MemoryStream 时,该流是否会创建自己的副本?如果,与直接从原始数组中读取字节相比,这是否是高性能场景中的性能问题? 最佳答案 它似乎没有在文档中明确提及,但请记住,您可
我是一名优秀的程序员,十分优秀!