-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdb.json
More file actions
1 lines (1 loc) · 31.5 KB
/
Copy pathdb.json
File metadata and controls
1 lines (1 loc) · 31.5 KB
1
{"meta":{"version":1,"warehouse":"2.2.0"},"models":{"Asset":[],"Cache":[{"_id":"source/_drafts/给-MUD-xyj-添加-UTF8-支持.md","hash":"d81356521be61f76a77cfae72406d00fcd6ae53e","modified":1517602140925},{"_id":"source/_posts/在C语言里用iconv转换字符编码(UTF8-GB18030).md","hash":"82f47d8eb09eca1e0762b7ffc41890873f56ab4c","modified":1517602140926},{"_id":"public/2018/02/03/在C语言里用iconv转换字符编码(UTF8-GB18030)/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1517602195413},{"_id":"public/archives/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1517602195414},{"_id":"public/archives/2018/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1517602195415},{"_id":"public/archives/2018/02/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1517602195415},{"_id":"public/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1517602195415},{"_id":"public/tags/C/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1517602195415},{"_id":"public/tags/iconv/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1517602195415}],"Category":[],"Data":[],"Page":[],"Post":[{"title":"给 MUD xyj 添加 UTF8 支持","_content":"1.问题的提出\n\n好久没有研究mud了,最近又想琢磨琢磨,然后就发现了[fluffos](https://github.com/fluffos/fluffos)这个项目。其中有一个改进,那就是终于支持utf8了。说起来mud这种史前产物大多数都是gb2312的,放到github上网页上竟是乱码,不爽的一笔。utf8这个改进还是值得跟进的。\n\n其实仔细研究MudOS代码的话,会发现其实从MudOS的层次上并不存在是否支持UTF8的问题。因为对于大多数情况,MudOS并没有什么需要解析的地方,所有字符串的内容,MudOS都是不关心的,MudOS只要用char数组整体传递就行了。\n","source":"_drafts/给-MUD-xyj-添加-UTF8-支持.md","raw":"---\ntitle: 给 MUD xyj 添加 UTF8 支持\ntags: MUD, LPC, C, iconv, xyj\n---\n1.问题的提出\n\n好久没有研究mud了,最近又想琢磨琢磨,然后就发现了[fluffos](https://github.com/fluffos/fluffos)这个项目。其中有一个改进,那就是终于支持utf8了。说起来mud这种史前产物大多数都是gb2312的,放到github上网页上竟是乱码,不爽的一笔。utf8这个改进还是值得跟进的。\n\n其实仔细研究MudOS代码的话,会发现其实从MudOS的层次上并不存在是否支持UTF8的问题。因为对于大多数情况,MudOS并没有什么需要解析的地方,所有字符串的内容,MudOS都是不关心的,MudOS只要用char数组整体传递就行了。\n","slug":"给-MUD-xyj-添加-UTF8-支持","published":0,"date":"2018-02-02T20:09:00.925Z","updated":"2018-02-02T20:09:00.925Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjd6d50v20000sit63xc9j46e","content":"<p>1.问题的提出</p>\n<p>好久没有研究mud了,最近又想琢磨琢磨,然后就发现了<a href=\"https://github.com/fluffos/fluffos\" target=\"_blank\" rel=\"noopener\">fluffos</a>这个项目。其中有一个改进,那就是终于支持utf8了。说起来mud这种史前产物大多数都是gb2312的,放到github上网页上竟是乱码,不爽的一笔。utf8这个改进还是值得跟进的。</p>\n<p>其实仔细研究MudOS代码的话,会发现其实从MudOS的层次上并不存在是否支持UTF8的问题。因为对于大多数情况,MudOS并没有什么需要解析的地方,所有字符串的内容,MudOS都是不关心的,MudOS只要用char数组整体传递就行了。</p>\n","site":{"data":{}},"excerpt":"","more":"<p>1.问题的提出</p>\n<p>好久没有研究mud了,最近又想琢磨琢磨,然后就发现了<a href=\"https://github.com/fluffos/fluffos\" target=\"_blank\" rel=\"noopener\">fluffos</a>这个项目。其中有一个改进,那就是终于支持utf8了。说起来mud这种史前产物大多数都是gb2312的,放到github上网页上竟是乱码,不爽的一笔。utf8这个改进还是值得跟进的。</p>\n<p>其实仔细研究MudOS代码的话,会发现其实从MudOS的层次上并不存在是否支持UTF8的问题。因为对于大多数情况,MudOS并没有什么需要解析的地方,所有字符串的内容,MudOS都是不关心的,MudOS只要用char数组整体传递就行了。</p>\n"},{"title":"在C语言里用iconv转换字符编码(UTF8->GB18030)","author":"sixue","date":"2018-02-02T17:39:00.000Z","_content":"iconv相关函数主要是三个\n\n``` C\niconv_t iconv_open(const char* tocode, const char* fromcode);\n\nsize_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);\n\nint iconv_close(iconv_t cd);\n```\n\n这段代码的作用是从一个文本文件里读出字符串,转换一下编码,再写入另一个文件\n\n``` C\n#include <stdio.h>\n#include <stdlib.h>\n#include <memory.h>\n#include <iconv.h>\n\nconst int LENGTH = 80;\nconst int BUFSZ = LENGTH * 2;\n\nint print_n_str(const char *str, long len)\n{\n char buf[BUFSZ];\n memset(buf, 0, BUFSZ);\n memcpy(buf, str, len);\n return printf(\"in:[%s](%ld)\\n\", buf, len);\n}\n\nint print_hex_str(const char *str, long len)\n{\n printf(\"out:[\");\n for (int i = 0; i < len; i++)\n {\n printf(\"%%%02x\", (unsigned char)str[i]);\n }\n printf(\"](%ld)\\n\", len);\n return 0;\n}\n\nint main()\n{\n iconv_t icv = iconv_open(\"GB18030\", \"UTF-8\");\n FILE *in = fopen(\"in.txt\", \"r\");\n FILE *out = fopen(\"out.txt\", \"w\");\n \n char in_line[BUFSZ];\n char out_line[BUFSZ];\n size_t left = 0;\n while (!feof(in))\n {\n memset(in_line + left, 0, BUFSZ - left);\n fread(in_line + left, 1, LENGTH, in);\n left = strlen(in_line);\n \n char *inbuf = in_line;\n char *outbuf = out_line;\n size_t inleft = left;\n size_t outleft = BUFSZ;\n iconv(icv, &inbuf, &inleft, &outbuf, &outleft);\n \n size_t ilen = left - inleft;\n print_n_str(in_line, ilen);\n if (!inleft)\n {\n memmove(in_line, in_line + ilen, inleft);\n }\n left = inleft;\n \n size_t olen = BUFSZ - outleft;\n print_hex_str(out_line, olen);\n fwrite(out_line, 1, olen, out);\n }\n fclose(in);\n fclose(out);\n iconv_close(icv);\n return 0;\n}\n```\n\n代码很简单,但实际上好几个坑:\n\n1.函数1,两个参数是dest, src很容易无意中写错了,然后还发现不了\n\n2.函数2,后面四个参数都是会变的,不要把原来的变量傻乎乎传进去到时候就找不回来了\n\n3.函数2,有些时候我们的inbuf里不一定是完整的utf8字符串,可能有一些是被截断的“半个汉字”,此时iconv()会返回-1,并且会有errno,但是其实在应用层,这未必是错误,而是需要处理的情况。此时就需要inbytesleft参数,这个参数存的是剩下没处理的数据。\n\n4.函数2,outbyetsleft指的是outbuf剩余的空闲空间,不要把它当成输出字符串的长度","source":"_posts/在C语言里用iconv转换字符编码(UTF8-GB18030).md","raw":"title: 在C语言里用iconv转换字符编码(UTF8->GB18030)\nauthor: sixue\ntags:\n - C\n - iconv\n - ''\ncategories: []\ndate: 2018-02-03 01:39:00\n---\niconv相关函数主要是三个\n\n``` C\niconv_t iconv_open(const char* tocode, const char* fromcode);\n\nsize_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);\n\nint iconv_close(iconv_t cd);\n```\n\n这段代码的作用是从一个文本文件里读出字符串,转换一下编码,再写入另一个文件\n\n``` C\n#include <stdio.h>\n#include <stdlib.h>\n#include <memory.h>\n#include <iconv.h>\n\nconst int LENGTH = 80;\nconst int BUFSZ = LENGTH * 2;\n\nint print_n_str(const char *str, long len)\n{\n char buf[BUFSZ];\n memset(buf, 0, BUFSZ);\n memcpy(buf, str, len);\n return printf(\"in:[%s](%ld)\\n\", buf, len);\n}\n\nint print_hex_str(const char *str, long len)\n{\n printf(\"out:[\");\n for (int i = 0; i < len; i++)\n {\n printf(\"%%%02x\", (unsigned char)str[i]);\n }\n printf(\"](%ld)\\n\", len);\n return 0;\n}\n\nint main()\n{\n iconv_t icv = iconv_open(\"GB18030\", \"UTF-8\");\n FILE *in = fopen(\"in.txt\", \"r\");\n FILE *out = fopen(\"out.txt\", \"w\");\n \n char in_line[BUFSZ];\n char out_line[BUFSZ];\n size_t left = 0;\n while (!feof(in))\n {\n memset(in_line + left, 0, BUFSZ - left);\n fread(in_line + left, 1, LENGTH, in);\n left = strlen(in_line);\n \n char *inbuf = in_line;\n char *outbuf = out_line;\n size_t inleft = left;\n size_t outleft = BUFSZ;\n iconv(icv, &inbuf, &inleft, &outbuf, &outleft);\n \n size_t ilen = left - inleft;\n print_n_str(in_line, ilen);\n if (!inleft)\n {\n memmove(in_line, in_line + ilen, inleft);\n }\n left = inleft;\n \n size_t olen = BUFSZ - outleft;\n print_hex_str(out_line, olen);\n fwrite(out_line, 1, olen, out);\n }\n fclose(in);\n fclose(out);\n iconv_close(icv);\n return 0;\n}\n```\n\n代码很简单,但实际上好几个坑:\n\n1.函数1,两个参数是dest, src很容易无意中写错了,然后还发现不了\n\n2.函数2,后面四个参数都是会变的,不要把原来的变量傻乎乎传进去到时候就找不回来了\n\n3.函数2,有些时候我们的inbuf里不一定是完整的utf8字符串,可能有一些是被截断的“半个汉字”,此时iconv()会返回-1,并且会有errno,但是其实在应用层,这未必是错误,而是需要处理的情况。此时就需要inbytesleft参数,这个参数存的是剩下没处理的数据。\n\n4.函数2,outbyetsleft指的是outbuf剩余的空闲空间,不要把它当成输出字符串的长度","slug":"在C语言里用iconv转换字符编码(UTF8-GB18030)","published":1,"updated":"2018-02-02T20:09:00.926Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjd6d50vg0003sit6bgpg70a3","content":"<p>iconv相关函数主要是三个</p>\n<figure class=\"highlight c\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">iconv_t</span> iconv_open(<span class=\"keyword\">const</span> <span class=\"keyword\">char</span>* tocode, <span class=\"keyword\">const</span> <span class=\"keyword\">char</span>* fromcode);</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">size_t</span> iconv(<span class=\"keyword\">iconv_t</span> cd, <span class=\"keyword\">char</span> **inbuf, <span class=\"keyword\">size_t</span> *inbytesleft, <span class=\"keyword\">char</span> **outbuf, <span class=\"keyword\">size_t</span> *outbytesleft);</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">int</span> <span class=\"title\">iconv_close</span><span class=\"params\">(<span class=\"keyword\">iconv_t</span> cd)</span></span>;</span><br></pre></td></tr></table></figure>\n<p>这段代码的作用是从一个文本文件里读出字符串,转换一下编码,再写入另一个文件</p>\n<figure class=\"highlight c\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br><span class=\"line\">60</span><br><span class=\"line\">61</span><br><span class=\"line\">62</span><br><span class=\"line\">63</span><br><span class=\"line\">64</span><br><span class=\"line\">65</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#<span class=\"meta-keyword\">include</span> <span class=\"meta-string\"><stdio.h></span></span></span><br><span class=\"line\"><span class=\"meta\">#<span class=\"meta-keyword\">include</span> <span class=\"meta-string\"><stdlib.h></span></span></span><br><span class=\"line\"><span class=\"meta\">#<span class=\"meta-keyword\">include</span> <span class=\"meta-string\"><memory.h></span></span></span><br><span class=\"line\"><span class=\"meta\">#<span class=\"meta-keyword\">include</span> <span class=\"meta-string\"><iconv.h></span></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">const</span> <span class=\"keyword\">int</span> LENGTH = <span class=\"number\">80</span>;</span><br><span class=\"line\"><span class=\"keyword\">const</span> <span class=\"keyword\">int</span> BUFSZ = LENGTH * <span class=\"number\">2</span>;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">int</span> <span class=\"title\">print_n_str</span><span class=\"params\">(<span class=\"keyword\">const</span> <span class=\"keyword\">char</span> *str, <span class=\"keyword\">long</span> len)</span></span></span><br><span class=\"line\"><span class=\"function\"></span>{</span><br><span class=\"line\"> <span class=\"keyword\">char</span> buf[BUFSZ];</span><br><span class=\"line\"> <span class=\"built_in\">memset</span>(buf, <span class=\"number\">0</span>, BUFSZ);</span><br><span class=\"line\"> <span class=\"built_in\">memcpy</span>(buf, str, len);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"built_in\">printf</span>(<span class=\"string\">\"in:[%s](%ld)\\n\"</span>, buf, len);</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">int</span> <span class=\"title\">print_hex_str</span><span class=\"params\">(<span class=\"keyword\">const</span> <span class=\"keyword\">char</span> *str, <span class=\"keyword\">long</span> len)</span></span></span><br><span class=\"line\"><span class=\"function\"></span>{</span><br><span class=\"line\"> <span class=\"built_in\">printf</span>(<span class=\"string\">\"out:[\"</span>);</span><br><span class=\"line\"> <span class=\"keyword\">for</span> (<span class=\"keyword\">int</span> i = <span class=\"number\">0</span>; i < len; i++)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"built_in\">printf</span>(<span class=\"string\">\"%%%02x\"</span>, (<span class=\"keyword\">unsigned</span> <span class=\"keyword\">char</span>)str[i]);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"built_in\">printf</span>(<span class=\"string\">\"](%ld)\\n\"</span>, len);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span>;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">int</span> <span class=\"title\">main</span><span class=\"params\">()</span></span></span><br><span class=\"line\"><span class=\"function\"></span>{</span><br><span class=\"line\"> <span class=\"keyword\">iconv_t</span> icv = iconv_open(<span class=\"string\">\"GB18030\"</span>, <span class=\"string\">\"UTF-8\"</span>);</span><br><span class=\"line\"> FILE *in = fopen(<span class=\"string\">\"in.txt\"</span>, <span class=\"string\">\"r\"</span>);</span><br><span class=\"line\"> FILE *out = fopen(<span class=\"string\">\"out.txt\"</span>, <span class=\"string\">\"w\"</span>);</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">char</span> in_line[BUFSZ];</span><br><span class=\"line\"> <span class=\"keyword\">char</span> out_line[BUFSZ];</span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> left = <span class=\"number\">0</span>;</span><br><span class=\"line\"> <span class=\"keyword\">while</span> (!feof(in))</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"built_in\">memset</span>(in_line + left, <span class=\"number\">0</span>, BUFSZ - left);</span><br><span class=\"line\"> fread(in_line + left, <span class=\"number\">1</span>, LENGTH, in);</span><br><span class=\"line\"> left = <span class=\"built_in\">strlen</span>(in_line);</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">char</span> *inbuf = in_line;</span><br><span class=\"line\"> <span class=\"keyword\">char</span> *outbuf = out_line;</span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> inleft = left;</span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> outleft = BUFSZ;</span><br><span class=\"line\"> iconv(icv, &inbuf, &inleft, &outbuf, &outleft);</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> ilen = left - inleft;</span><br><span class=\"line\"> print_n_str(in_line, ilen);</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (!inleft)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> memmove(in_line, in_line + ilen, inleft);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> left = inleft;</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> olen = BUFSZ - outleft;</span><br><span class=\"line\"> print_hex_str(out_line, olen);</span><br><span class=\"line\"> fwrite(out_line, <span class=\"number\">1</span>, olen, out);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> fclose(in);</span><br><span class=\"line\"> fclose(out);</span><br><span class=\"line\"> iconv_close(icv);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span>;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>代码很简单,但实际上好几个坑:</p>\n<p>1.函数1,两个参数是dest, src很容易无意中写错了,然后还发现不了</p>\n<p>2.函数2,后面四个参数都是会变的,不要把原来的变量傻乎乎传进去到时候就找不回来了</p>\n<p>3.函数2,有些时候我们的inbuf里不一定是完整的utf8字符串,可能有一些是被截断的“半个汉字”,此时iconv()会返回-1,并且会有errno,但是其实在应用层,这未必是错误,而是需要处理的情况。此时就需要inbytesleft参数,这个参数存的是剩下没处理的数据。</p>\n<p>4.函数2,outbyetsleft指的是outbuf剩余的空闲空间,不要把它当成输出字符串的长度</p>\n","site":{"data":{}},"excerpt":"","more":"<p>iconv相关函数主要是三个</p>\n<figure class=\"highlight c\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">iconv_t</span> iconv_open(<span class=\"keyword\">const</span> <span class=\"keyword\">char</span>* tocode, <span class=\"keyword\">const</span> <span class=\"keyword\">char</span>* fromcode);</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">size_t</span> iconv(<span class=\"keyword\">iconv_t</span> cd, <span class=\"keyword\">char</span> **inbuf, <span class=\"keyword\">size_t</span> *inbytesleft, <span class=\"keyword\">char</span> **outbuf, <span class=\"keyword\">size_t</span> *outbytesleft);</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">int</span> <span class=\"title\">iconv_close</span><span class=\"params\">(<span class=\"keyword\">iconv_t</span> cd)</span></span>;</span><br></pre></td></tr></table></figure>\n<p>这段代码的作用是从一个文本文件里读出字符串,转换一下编码,再写入另一个文件</p>\n<figure class=\"highlight c\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br><span class=\"line\">60</span><br><span class=\"line\">61</span><br><span class=\"line\">62</span><br><span class=\"line\">63</span><br><span class=\"line\">64</span><br><span class=\"line\">65</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#<span class=\"meta-keyword\">include</span> <span class=\"meta-string\"><stdio.h></span></span></span><br><span class=\"line\"><span class=\"meta\">#<span class=\"meta-keyword\">include</span> <span class=\"meta-string\"><stdlib.h></span></span></span><br><span class=\"line\"><span class=\"meta\">#<span class=\"meta-keyword\">include</span> <span class=\"meta-string\"><memory.h></span></span></span><br><span class=\"line\"><span class=\"meta\">#<span class=\"meta-keyword\">include</span> <span class=\"meta-string\"><iconv.h></span></span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">const</span> <span class=\"keyword\">int</span> LENGTH = <span class=\"number\">80</span>;</span><br><span class=\"line\"><span class=\"keyword\">const</span> <span class=\"keyword\">int</span> BUFSZ = LENGTH * <span class=\"number\">2</span>;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">int</span> <span class=\"title\">print_n_str</span><span class=\"params\">(<span class=\"keyword\">const</span> <span class=\"keyword\">char</span> *str, <span class=\"keyword\">long</span> len)</span></span></span><br><span class=\"line\"><span class=\"function\"></span>{</span><br><span class=\"line\"> <span class=\"keyword\">char</span> buf[BUFSZ];</span><br><span class=\"line\"> <span class=\"built_in\">memset</span>(buf, <span class=\"number\">0</span>, BUFSZ);</span><br><span class=\"line\"> <span class=\"built_in\">memcpy</span>(buf, str, len);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"built_in\">printf</span>(<span class=\"string\">\"in:[%s](%ld)\\n\"</span>, buf, len);</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">int</span> <span class=\"title\">print_hex_str</span><span class=\"params\">(<span class=\"keyword\">const</span> <span class=\"keyword\">char</span> *str, <span class=\"keyword\">long</span> len)</span></span></span><br><span class=\"line\"><span class=\"function\"></span>{</span><br><span class=\"line\"> <span class=\"built_in\">printf</span>(<span class=\"string\">\"out:[\"</span>);</span><br><span class=\"line\"> <span class=\"keyword\">for</span> (<span class=\"keyword\">int</span> i = <span class=\"number\">0</span>; i < len; i++)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"built_in\">printf</span>(<span class=\"string\">\"%%%02x\"</span>, (<span class=\"keyword\">unsigned</span> <span class=\"keyword\">char</span>)str[i]);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"built_in\">printf</span>(<span class=\"string\">\"](%ld)\\n\"</span>, len);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span>;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"function\"><span class=\"keyword\">int</span> <span class=\"title\">main</span><span class=\"params\">()</span></span></span><br><span class=\"line\"><span class=\"function\"></span>{</span><br><span class=\"line\"> <span class=\"keyword\">iconv_t</span> icv = iconv_open(<span class=\"string\">\"GB18030\"</span>, <span class=\"string\">\"UTF-8\"</span>);</span><br><span class=\"line\"> FILE *in = fopen(<span class=\"string\">\"in.txt\"</span>, <span class=\"string\">\"r\"</span>);</span><br><span class=\"line\"> FILE *out = fopen(<span class=\"string\">\"out.txt\"</span>, <span class=\"string\">\"w\"</span>);</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">char</span> in_line[BUFSZ];</span><br><span class=\"line\"> <span class=\"keyword\">char</span> out_line[BUFSZ];</span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> left = <span class=\"number\">0</span>;</span><br><span class=\"line\"> <span class=\"keyword\">while</span> (!feof(in))</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"built_in\">memset</span>(in_line + left, <span class=\"number\">0</span>, BUFSZ - left);</span><br><span class=\"line\"> fread(in_line + left, <span class=\"number\">1</span>, LENGTH, in);</span><br><span class=\"line\"> left = <span class=\"built_in\">strlen</span>(in_line);</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">char</span> *inbuf = in_line;</span><br><span class=\"line\"> <span class=\"keyword\">char</span> *outbuf = out_line;</span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> inleft = left;</span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> outleft = BUFSZ;</span><br><span class=\"line\"> iconv(icv, &inbuf, &inleft, &outbuf, &outleft);</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> ilen = left - inleft;</span><br><span class=\"line\"> print_n_str(in_line, ilen);</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (!inleft)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> memmove(in_line, in_line + ilen, inleft);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> left = inleft;</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">size_t</span> olen = BUFSZ - outleft;</span><br><span class=\"line\"> print_hex_str(out_line, olen);</span><br><span class=\"line\"> fwrite(out_line, <span class=\"number\">1</span>, olen, out);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> fclose(in);</span><br><span class=\"line\"> fclose(out);</span><br><span class=\"line\"> iconv_close(icv);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"number\">0</span>;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>代码很简单,但实际上好几个坑:</p>\n<p>1.函数1,两个参数是dest, src很容易无意中写错了,然后还发现不了</p>\n<p>2.函数2,后面四个参数都是会变的,不要把原来的变量傻乎乎传进去到时候就找不回来了</p>\n<p>3.函数2,有些时候我们的inbuf里不一定是完整的utf8字符串,可能有一些是被截断的“半个汉字”,此时iconv()会返回-1,并且会有errno,但是其实在应用层,这未必是错误,而是需要处理的情况。此时就需要inbytesleft参数,这个参数存的是剩下没处理的数据。</p>\n<p>4.函数2,outbyetsleft指的是outbuf剩余的空闲空间,不要把它当成输出字符串的长度</p>\n"}],"PostAsset":[],"PostCategory":[],"PostTag":[{"post_id":"cjd6d50v20000sit63xc9j46e","tag_id":"cjd6d50va0001sit61c14m505","_id":"cjd6d50vc0002sit61bcv5i7y"},{"post_id":"cjd6d50vg0003sit6bgpg70a3","tag_id":"cjd6d50vj0004sit68nf9lwm8","_id":"cjd6d50vl0006sit6yb1g55hx"},{"post_id":"cjd6d50vg0003sit6bgpg70a3","tag_id":"cjd6d50vk0005sit6rcwlx6h0","_id":"cjd6d50vl0007sit6jkxoma6q"}],"Tag":[{"name":"MUD, LPC, C, iconv, xyj","_id":"cjd6d50va0001sit61c14m505"},{"name":"C","_id":"cjd6d50vj0004sit68nf9lwm8"},{"name":"iconv","_id":"cjd6d50vk0005sit6rcwlx6h0"}]}}