将正确转义的字符串写入文件

将正确转义的字符串写入文件

我必须将正确(如 JSON 或 Javascript)转义的字符串写入文件。

我的最小例子是

\documentclass{standalone}

\begingroup
\catcode`<=1 \catcode`>=2
\catcode`{=12 \catcode`}=12
\gdef\wbgroup<{>
\gdef\wegroup<}>
\endgroup

\def\mytitle{This is a "title" for me}

\begin{document}
\newwrite\jsonwrite
\immediate\openout\jsonwrite=file.json
\immediate\write\jsonwrite{\wbgroup}
\immediate\write\jsonwrite{  title: "\mytitle"}
\immediate\write\jsonwrite{\wegroup}
\end{document}

我得到的是一个 file.json

{
 title: "This is a "title" for me"
}

而我需要的是内部引号转义,如下所示

{
 title: "This is a \"title\" for me"
}

我有个建议写入文件时转义引号但如果我这样做

\documentclass{standalone}

\begingroup
\catcode`<=1 \catcode`>=2
\catcode`{=12 \catcode`}=12
\gdef\wbgroup<{>
\gdef\wegroup<}>
\endgroup

\usepackage[T1]{fontenc}
\usepackage{expl3}
\ExplSyntaxOn
\newcommand{\myescapestring}[1]{
  \tl_set:Nn \l_tmpa_tl {#1}
  \regex_replace_all:nnN {"} {\u{c_backslash_str}"} \l_tmpa_tl
  \tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff

\def\mytitle{This is a "title" for me}

\begin{document}
\newwrite\jsonwrite
\immediate\openout\jsonwrite=file.json
\immediate\write\jsonwrite{\wbgroup}
\immediate\write\jsonwrite{  title: "\myescapestring\mytitle"}
\immediate\write\jsonwrite{\wegroup}
\end{document}

我得到了更糟糕的结果,即

{
 title: "\tl_set:Nn {This is a "title" for me}\regex_replace_all:nnN {"}{\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {c_backslash_str\global \mathchardef \accent@spacefactor \spacefactor }\let \begingroup \endgroup \relax \let \ignorespaces \relax \accent 8 c_backslash_str\egroup \spacefactor \accent@spacefactor "}"
}

我只能使用 PDFLaTeX 而无法使用 LUATex,因为我在原始文档的其他部分使用了 PDFLaTeX 的许多功能。

所以本质上我正在寻找 PDFTeX 中 Javascript 的 stringEscape 函数。

答案1

您需要在写入之前进行转义,因为它不是一个可扩展的操作。

在不知道你想要写出什么细节的情况下,一个可能的解决方案

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\jsonwrite}{mmmm}
 {% #1 = file name,
  % #2 = initial part
  % #3 = middle part
  % #4 = final part
  \nkiad_jsonwrite:nnnn { #1 } { #2 } { #3 } { #4 }
 }

\iow_new:N \g__nkiad_jsonwrite_iow
\tl_new:N \l__nkiad_jsonwrite_item_tl

\cs_generate_variant:Nn \iow_now:Nn { NV }

\cs_new_protected:Nn \nkiad_jsonwrite:nnnn
 {
  \iow_open:Nn \g__nkiad_jsonwrite_iow { #1 }
  \iow_now:Nx \g__nkiad_jsonwrite_iow { \c_left_brace_str }
  \tl_set:Nx \l__nkiad_jsonwrite_item_tl { #3 }
  \regex_replace_all:nnN { \" } { \cO\\ \" } \l__nkiad_jsonwrite_item_tl
  \iow_now:Nx \g__nkiad_jsonwrite_iow
   {
    #2 % initial part
    \l__nkiad_jsonwrite_item_tl % middle part
    #4 % final part
   }
  \iow_now:Nx \g__nkiad_jsonwrite_iow { \c_right_brace_str }
  \iow_close:N \g__nkiad_jsonwrite_iow
 }
\ExplSyntaxOff

\def\mytitle{This is a "title" for me}

\begin{document}

\jsonwrite{\jobname.json}{  title: "}{\mytitle}{"}

\end{document}

我们需要区分需要转义的引号(包含在中的引号\mytitle)和不需要转义的引号。

相关内容