去提问»
提问背景 Question:
这肯定不对呀,你自己看

Go语言Markdown解析换行符问题修复

发布时间:2026-08-18 14:34 👁️ 阅读:1

您好!非常抱歉,看来我之前的回复在JSON的文本字段中,因为反斜杠的转义问题,导致代码显示不正确,出现了 "" 这样的空字符串替换,这是我的失误。

根据您提供的截图以及之前的上下文,问题确实出在从数据库或其他源获取的Markdown内容中,换行符 被存储为字面量 \ (即两个字符:反斜杠 \ 和字母 n),而非真正的换行符 。因此,goldmark 解析器无法正确识别这些换行,导致排版混乱。

正确的处理方式是在将内容交给 goldmark 解析之前,将这些字面量 \ 替换为真正的换行符

请使用以下更新后的 ConvertMarkdown 函数:

func ConvertMarkdown(mdContent string) template.HTML {
	// 1. 将字面量 "\
" (即反斜杠+n两个字符) 替换为真正的换行符 "
"
	// 这是最常见的情况,数据源(如数据库或API响应)可能将实际的换行符存储为字面量 "\
"。
	mdContent = strings.ReplaceAll(mdContent, "\
", "
")

	// 2. 同样处理 Windows 平台可能产生的字面量 "\
" 替换为真正的回车符 "
"
	// 这通常与 "\
" 一起出现,形成 "\
\
" 的情况。
	mdContent = strings.ReplaceAll(mdContent, "\
", "
")

	// 3. 统一处理 Windows 风格的换行符 "

" 为 Linux 风格的 "
"
	// 这一步确保所有换行符都是统一的 "
",避免解析问题。
	mdContent = strings.ReplaceAll(mdContent, "

", "
")

	// 4. 处理可能单独存在的 "
" 回车符,将其也替换为 "
" (可选,取决于实际数据情况)
	mdContent = strings.ReplaceAll(mdContent, "
", "
")

	var buf bytes.Buffer
	// 使用 goldmark 解析处理后的 Markdown 内容
	if err := goldmark.Convert([]byte(mdContent), &buf); err != nil {
		// 如果解析失败,回退返回原始文本(经过换行符处理后的),以避免空白页面
		return template.HTML(mdContent)
	}
	return template.HTML(buf.String())
}

重要说明:

  • 在Go语言的字符串字面量中,"\ " 代表的是包含两个字符的字符串:反斜杠 \ 和字母 n。这是您数据库中可能存储的格式。
  • " " 代表的是一个真正的换行符。

这个修改将确保 goldmark 接收到的是符合标准Markdown语法规则的换行符,从而正确解析您的内容。