遇到doxygen生成的chm文档目录如果有中文是乱码?

原因不在于doxygen,它没有问题,问题出在微软的HTML Help Workshop的hhc.exe不支持utf8.所以要解决这个问题,需要做两个额外的步骤:

1.将html/index.hhp中的Language=0x409 English (United States)换成Language=0x804 中文 (中国),并将文本存成UTF8格式。

2.将html/index.hhc整个文件从UTF8编码换成gb2312,再次手动调用hhc.exe去处理这个hhp文件即可生成不是乱码的中文chm帮助文档。

我自己用C#写了个小工具来处理这个过程,源代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;

namespace Generator
{
    class Program
    {

        static void Main(string[] args)
        {
            if(args.Length <=0)
            {
                Console.WriteLine("Error:缺少目标配置文件");
                return;
            }

            string path = args[0];

            if(!File.Exists(path))
            {
                Console.WriteLine(string.Format("{0}不存在", path));
                return;
            }

            using(ChmGenerator generator = new ChmGenerator(path))
            {
                generator.Generate();
            }
        }
    }

    public class ChmGenerator : IDisposable
    {
        static readonly string HHC_CONFIG_LOCATION = "HHC_LOCATION           = \"C:/Program Files (x86)/HTML Help Workshop/hhc.exe\"";

        string WorkDirectory;
        string InputFile;
        string ConfigText;
        string NewHHCConfig;
        string NewConfigText;
        string NewConfigPath;

        string HHCLocation;
        string DoxygenPath;

        string IntermediatePath;
        string IntermediateHHP;
        string IntermediateHHC;

        public ChmGenerator(string inputFile)
        {
            InputFile = inputFile;

            string Directory = Path.GetDirectoryName(InputFile);
            WorkDirectory = Directory;

            System.IO.Directory.SetCurrentDirectory(WorkDirectory);

            HHCLocation = Path.Combine(Directory, "hhc.exe");
            DoxygenPath = Path.Combine(Directory, "doxygen.exe");
            IntermediatePath = Path.Combine(Directory, "Intermediate");
            IntermediateHHP = Path.Combine(IntermediatePath, @"html/index.hhp");
            IntermediateHHC = Path.Combine(IntermediatePath, @"html/index.hhc");
            NewHHCConfig = string.Format("HHC_LOCATION           = \"{0}\"", HHCLocation);
        }

        public void Dispose()
        {
            try
            {
                if (!string.IsNullOrEmpty(NewConfigPath) && File.Exists(NewConfigPath))
                {
                    File.Delete(NewConfigPath);
                }
            }
            finally
            {

            }
        }

        public void Generate()
        {
            ConfigText = File.ReadAllText(InputFile, Encoding.UTF8);

            NewConfigPath = Path.Combine(WorkDirectory, Guid.NewGuid().ToString() + ".doxygenProj");
            NewConfigText = ConfigText.Replace(HHC_CONFIG_LOCATION, NewHHCConfig);

            File.WriteAllText(NewConfigPath, NewConfigText, Encoding.UTF8);

            // 调用doxygen来生成
            StartProc(DoxygenPath, string.Format(" {0}", NewConfigPath));

            if(!PrepareInputFiles())
            {
                Console.WriteLine("无法正确生成chm");
                return;
            }

            // 调用hhc生成chm
            StartProc(HHCLocation, string.Format(" {0}", IntermediateHHP));

        }

        private bool PrepareInputFiles()
        {
            // 替换Language
            if (File.Exists(IntermediateHHP))
            {
                ReplaceFileText(IntermediateHHP, "Language=0x409 English (United States)", "Language=0x804 中文 (中国)", Encoding.UTF8);

                if (File.Exists(IntermediateHHC))
                {
                    ChangeFileToAnsi(IntermediateHHC, Encoding.UTF8, Encoding.GetEncoding("gb2312"));

                    return true;
                }
                else
                {
                    Console.WriteLine(string.Format("Error:{0}不存在", IntermediateHHC));
                }
            }
            else
            {
                Console.WriteLine(string.Format("Error:{0}不存在", IntermediateHHP));
            }

            return false;
        }

        private void ChangeFileToAnsi(string inputPath, Encoding sourceEncoding, Encoding destEncoding)
        {
            var text = File.ReadAllText(inputPath, sourceEncoding);
            byte[] bytes = sourceEncoding.GetBytes(text);

            // convert to win bytes
            var destBytes = Encoding.Convert(
                sourceEncoding, destEncoding, bytes);

            File.WriteAllBytes(inputPath, destBytes);
        }

        private void ReplaceFileText(string inputPath, string sourceText, string destText, Encoding encoding)
        {
            var text = File.ReadAllText(inputPath, Encoding.UTF8);
            text = text.Replace(sourceText, destText);
            File.WriteAllText(inputPath, text, encoding);
        }

        static void StartProc(string application, string command)
        {
            Debug.Assert(File.Exists(application));

            var process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = application,
                    Arguments = " " + command,
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    WindowStyle = ProcessWindowStyle.Hidden,
                    CreateNoWindow = true,
                    StandardOutputEncoding = Encoding.UTF8
                }
            };

            process.Start();

            while (!process.StandardOutput.EndOfStream)
            {
                string line = process.StandardOutput.ReadLine();

                Console.WriteLine(line);
               // Debug.WriteLine(line);
            }

            process.WaitForExit();
        }
    }
}

另外为了确保目标机器没有安装doxygen或者hhc都不影响我生成文档,因此我将这些执行档都复制了一份放到了doxygen项目下,代码中的一些额外步骤就是强行将原始project文件中的hhc路径改成当前目录下的hhc。

目录结构如下:

原文地址:https://www.cnblogs.com/bodong/p/12176236.html

时间: 2024-10-29 03:28:13

遇到doxygen生成的chm文档目录如果有中文是乱码?的相关文章

使用Doxygen生成net帮助文档

转自:使用Doxygen生成net帮助文档 一. 什么是Doxygen?Doxygen 是一个程序的文件产生工具,可将程序中的特定批注转换成为说明文件.通常我们在写程序时,或多或少都会写上批注,但是对于其它人而言,要直接探索程序里的批注,与打捞铁达尼号同样的辛苦.大部分有用的批注都是属于针对函式,类别等等的说明.所以,如果能依据程序本身的结构,将批注经过处理重新整理成为一个纯粹的参考手册,对于后面利用您的程序代码的人而言将会减少许多的负担.不过,反过来说,整理文件的工作对于您来说,就是沉重的负担

ns3使用doxygen生成离线api文档

doxygen的维基介绍: Doxygen是一个编写软件参考文檔的工具.该文檔是直接写在源代码中,因此比较容易保持更新.Doxygen可以交叉引用文檔和源代码,使文件的读者可以很容易地引用实际的源代码. ns3的官方也有doxygen生成的文档,参见:ns3官方doxygen 但是由于网络或者其它原因,我们有本地离线访问的需求,于是doxygen就派上用场了.下面来看看怎么使用doxygen: 1. 官方的方法如下: ns-3 requires Doxygen version 1.5.4 or

?生成chm文档工具- Sandcastle -摘自网络

Sandcastle是微软官方的文档生成工具,NDoc开发停止后,这个貌似也是唯一的一个这方面的工具.它从dll文件及其xml注释文件能够 生成完整的帮助文档,支持多种生成格式(Helpe1x:chm, Helper2x:Hxs, Website,HelperView),结合新发布的Sandcastle Help File Builder可视化工具,整个生成过程十分简单,而且SHFB工具看起来很强大,不仅能够直接配置生成文档的各个属性,而且还支持很灵活的扩展设置,为 我们提供完美的.NET类库文

如何生成项目的chm文档

如何生成项目的chm文档 2014-11-30 Generate .chm based documentation of your project using SandCastle  tool

使用 Sandcastle 生成代码帮助文档

使用 Sandcastle可以生成MSDN风格的帮助文档,生成的帮助文档既可以是chm文档,也可以是MS Help 2.x帮助文档. 1 下载并安装Sandcastle Sandcastle下载地址为:http://sandcastle.codeplex.com/ 2 下载并安装HTML Help Workshop HTML Help Workshop可以用来生成chm文件,有的系统可能已经安装了HTML Help Workshop,HTML Help Workshop的默认安装路径为C:\Pr

使用sphinx快速生成Python API 文档

一  简单介绍 不管是开源还是闭源,文档都是很重要的.当然理论上说,最好的文档就是代码本身,但是要让所有人都能读懂你的代码这太难了.所以我们要写文档.大部分情况,我们不希望维护一份代码再加上一份文档,这样做很容易造成文档和代码的不一致,程序员最讨厌更新文档了.所以最佳实践就是在程序员代码中加注释,然后通过构建脚本自通生成文档,包括html,latex,pdf等. 对应于Pyhon,有很多可供选择的工具: sphinx中文版介绍 Sphinx使用 reStructuredText作为标记语言(类似

作为一个程序猿,是不是经常会用到.chm文档,但是我们可能会遇到这样那样的问题,比如.chm文档打不开

.chm文档不能正常打开,一般有两种情形下会造成文档打不开, 1.系统语言栏的语言和文档的语言类别不一同,也就是说比如你的文档是中文版的,但是系统设置的语言是其他国家的.不过一般这种情况很少出现 ,谁他们吃多了去改系统语言.所以这种情况,我就不做过多的解释了 2.这种就是由于你的系统自带的hh.exe文件损坏或者不存在被你误删了,首先,你要做的就是到C:\WINDOWS目录下找找你的hh.exe文件是否存在,如果不存在你就从其他电脑copy过来,这个文件是系统自带的用于阅读.chm文档的 ,假如

利用Swagger Maven Plugin生成Rest API文档

利用Swagger Maven Plugin生成Rest API文档 Swagger Maven Plugin This plugin enables your Swagger-annotated project to generate Swagger specs and customizable, templated static documents during the maven build phase. Unlike swagger-core, swagger-maven-plugin

生成iOS-Xcode技术文档

从源码中抽取注释生成文档的专用工具: [doxygen](http://www.stack.nl/~dimitri/doxygen/index.html):适于生成html文档与pdf文档. 支持的语言多,可以配置的地方也比较多.默认生成的风格与苹果的风格不一致. [headdoc](http://developer.apple.com/opensource/tools/headerdoc.html) :是 Xcode 自带的文档生成工具.在安装完 Xcode 后,就可以用命令行来生成对应的文档