- 论坛徽章:
- 0
|
ddd
- #include <stdio.h>
- #include <assert.h>
- #include <iconv.h>
- int jsstring_conv(char *ibuf, char *obuf, size_t olen)
- {
- char text[5];
- char *p, *outbuf = obuf;
- char *outbuf_end = &obuf[olen];
- char utf16[3];
- int count = 0;
- iconv_t cd = iconv_open("UTF-8", "UTF-16LE");
- if (cd == (iconv_t)-1)
- return 0;
- for (p=ibuf; outbuf<outbuf_end&&*p!='\0'; p++){
- if (count == 0){
- if (*p != '\\')
- *outbuf++ = *p;
- else
- count = 5;
- continue;
- }
- assert(count>0);
- text[5-count] = *p;
- count--;
- char *inptr = utf16;
- int code = 0;
- size_t inlen = 2;
- size_t outlen = outbuf_end-outbuf;
- if (text[0] != 'u'){
- *outbuf++ = '\\';
- *outbuf++ = *p;
- count = 0;
- }else if (count == 0){
- sscanf(text+1, "%x", &code);
- utf16[0] = code;
- utf16[1] = (code>>8);
- iconv(cd, &inptr, &inlen, &outbuf, &outlen);
- }
- }
- iconv_close(cd);
- return outbuf-obuf;
- }
- int main(int argc, char *argv[])
- {
- char *title = "aaagooohelp\\u6d4bbaidu";
- /* char *title = "aaagooou6d4bbaidu"; */
- char buffer[1024];
- int count = jsstring_conv(title, buffer, sizeof(buffer)-1);
- buffer[count] = 0;
- printf("%s\n", buffer);
- return 0;
- }
复制代码
[ 本帖最后由 pagx 于 2009-2-9 22:49 编辑 ] |
|