C# .NET:将.doc转换为.htm会产生时髦的字符

C# .NET:将.doc转换为.htm会产生时髦的字符,c#,encoding,C#,Encoding,我使用MS Word automation将.doc保存为.htm。如果.doc文件中有项目符号字符,它们会很好地保存到.htm文件中,但是当我尝试将.htm文件读入字符串时(这样我可以随后将其作为字符串而不是blob发送到数据库进行最终存储),项目符号会转换为问号或其他字符,具体取决于加载到字符串中所使用的编码 我用这个来读课文: string html = File.ReadAllText(myFileSpec); 我也尝试过使用StreamReader,但得到了相同的结果(可能File.

我使用MS Word automation将.doc保存为.htm。如果.doc文件中有项目符号字符,它们会很好地保存到.htm文件中,但是当我尝试将.htm文件读入字符串时(这样我可以随后将其作为字符串而不是blob发送到数据库进行最终存储),项目符号会转换为问号或其他字符,具体取决于加载到字符串中所使用的编码

我用这个来读课文:

string html = File.ReadAllText(myFileSpec);
我也尝试过使用StreamReader,但得到了相同的结果(可能File.ReadAllText在内部使用了它)

我还尝试在File.ReadAllText的第二个重载中指定每种编码类型:

string html = File.ReadAllText(originalFile, Encoding.ASCII);
我已经尝试了编码类型的所有可用枚举


有什么想法吗?

您是否尝试以二进制模式打开文件。如果你在测试模式下打开,我想它会切碎unicode字符。

Word的
.doc
。html
转换会将项目符号变成问号(而且它与
文件.ReadAllText
StreamReader
等无关)

i、 e.当它到达
File.ReadAllText
时,它已经是一个问号

当我在Word2003中将一个简单的单词列表转换成HTML时,我得到

 <ul style='margin-top:0cm' type=disc> 
     <li class=MsoNormal style='mso-list:l0 level1 lfo1;tab-stops:list 36.0pt'>
       <span lang=EN-GB style='mso-ansi-language:EN-GB'>Test 1</span>
     </li> 
     <li class=MsoNormal style='mso-list:l0 level1 lfo1;tab-stops:list 36.0pt'>
       <span lang=EN-GB style='mso-ansi-language:EN-GB'>Test 2</span>
     </li> 
 </ul>
  • 测试1
  • 测试2

它很难看,但它不包含任何可能成为问号的内容

这些字符在HTML文件中是什么样子的?这个文件的编码声明是什么(在元标记“Content Type”中)?理想情况下,这些字符应转换为实体或UTF-8字符。
回答这些问题可能会引导您找到解决方案…:-)

在我的系统上(使用美式英语),Word将*.htm文件保存在Windows-1252代码页中。如果您的系统使用该代码页,那么您应该将其作为代码页来读取

string html = File.ReadAllText(originalFile, Encoding.GetEncoding(1252));

不过,也有可能无论您使用的是什么视图,结果都会给您留下问号,所以请务必检查一下。

好的,显然我在第一次陈述中撒了谎。我想我已经尝试了每种编码,但我没有尝试过:

data = File.ReadAllText(tempFile, Encoding.Default);

您可能认为这个方法的重载(您不指定编码)可以正常工作,默认编码应该是encoding.default。但是,默认情况下,它实际上使用Encoding.UTF8。希望这对其他人有所帮助。

我必须以文本形式打开它,因为它将以文本形式存储在数据库中。问得好,但我已经验证过了。我们的编辑器实际上是在文档中插入项目符号字符,而不是使用项目符号列表。但是我找到了答案。见下文。