codehighlighter里中文乱码问题

在toto博客中使用了 codehighliter 这个gem来表现代码部分到html格式.
但是在代码中加入中文则出现乱码.

本文介绍出现该问题到解决方法及我对该问题的追踪过程.

解决方法

1.新建一个mylib.rb文件,写入下列代码:

 1module Rack
 2  class Codehighlighter
 3    include Rack::Utils
 4    def call(env)
 5      began_at = Time.now
 6      status, headers, response = @app.call(env)
 7      headers = HeaderHash.new(headers)
 8
 9      if !STATUS_WITH_NO_ENTITY_BODY.include?(status) &&
10      !headers['transfer-encoding'] &&
11      headers['content-type'] &&
12      headers['content-type'].include?("text/html")
13
14        content = ""
15        response.each { |part| content += part }
16        doc = Nokogiri::HTML(content, nil, 'UTF-8')
17        nodes = doc.search(@opts[:element])
18        nodes.each do |node|
19          s = node.inner_html || "[++where is the code?++]"
20          if @opts[:markdown]
21            #原代码为node.parent.swap(s)
22            node.parent.swap(Nokogiri::XML::DocumentFragment.new(doc,send(@highlighter, s)))
23          else
24            #原代码为node.swap(s)
25            node.swap(Nokogiri::XML::DocumentFragment.new(doc,send(@highlighter, s)))
26          end
27        end
28
29        body = doc.to_html
30        headers['content-length'] = bytesize(body).to_s
31
32        log(env, status, headers, began_at) if @opts[:logging]
33        [status, headers, [body]]
34      else
35        [status, headers, response]
36      end
37    end
38  end
39end

2.在config.ru中将刚刚添加到文件引用到其中然后就可以运行.

1    require './mylib'     #必须放在require 'rack/codehighlighter'之后

过程及原因.

codehighlighter 中引用了nokogiri,nokogiri是对html文件进行出来到一个类库,它是用c语言写成的.

codehighlighter定义了解析格式,由nokogiri配合将markdown(或其他渲染)中这些格式转换成html标签和属性.

但是 nokogiri 对解析中文字符串到解析有很多问题,并且这个问题用iconv貌似也解决不了.
例如 codehighlighter 使用到的swap()就是这个问题.
swap()在处理中文字符串时就无法解析,原因可能是起原生c代码到问题,但我懒得去看源代码,找不到究竟是什么原因.

我在nokogiri的项目组提出了这个问题,有人告诉我swap在解析字符串时遇到的问题
在Nokogiri::XML::DocumentFragment中就不会出现.
详细可以看这里https://github.com/tenderlove/nokogiri/issues/587

Powered by Engin & toto

comments powered by Disqus