zoukankan      html  css  js  c++  java
  • Unicode转义(uXXXX)的编码和解码 go-nascii 类似于 native2ascii

    go-nascii 原来是一个日本人用go语言写的程序,不过原版不支持管道输入,我增加了管道输入功能;

    可执行文件下载地址:https://pan.baidu.com/s/1yBS5lmiMFCd86Wvtei-y8Q 提取码: 4znn

    native2ascii 也能实现,但是经过测试发现ascii码和uXXXX 混合模式时不完美

    package main
    
    import (
        "fmt"
        "os"
        "bufio"
        "regexp"
        "strconv"
        "strings"
        "unicode"
        "unicode/utf8"
    
        "github.com/jessevdk/go-flags"
    )
    
    type option struct {
        IsReverse []bool `short:"r" long:"reverse" description:"Unicode code points to string. E.g. \u3042\u3044\u3046\u3048\u304A -> あいうえお"`
    }
    
    var re = regexp.MustCompile(`\[uU][0-9a-fA-F]{4}`)
    
    func main() {
        var opt option
        args, err := flags.ParseArgs(&opt, os.Args)
        if err != nil {
            os.Exit(0);
            //panic(err)
        }
        var instr string
        for _, arg := range args[1:] {
            instr = arg
        }
    
        if len(instr) == 0{
            input := bufio.NewScanner(os.Stdin)
            input.Scan()
            instr = input.Text()
        }
        isReverse := 0 < len(opt.IsReverse)
        if isReverse {
            asciiToUtf8(instr)
        } else {
            utf8ToAscii(instr)
        }
    }
    
    func utf8ToAscii(s string) {
        if !utf8.ValidString(s) {
            fmt.Printf("'%s' includes non-UTF8 value(s).
    ", s)
            return
        }
    
        for _, r := range s {
            if r <= unicode.MaxASCII && !unicode.IsControl(r) {
                fmt.Print(string(r))
            } else {
                codepoint := fmt.Sprintf("%U", r)[2:]
                fmt.Printf("\u%s", codepoint)
            }
        }
        fmt.Println()
    }
    
    func asciiToUtf8(s string) {
        // TODO: handle surrogate pairs.
    
        match := re.FindString(s)
        if match == "" {
            fmt.Println(s)
            return
        }
    
        codepoint := match[2:]
        n, err := strconv.ParseInt(codepoint, 16, 32)
        if err != nil {
            fmt.Printf("'%s' can't be converted to number.
    ", codepoint)
            return
        }
    
        r := int32(n)
        s = strings.Replace(s, match, string(r), -1)
    
        asciiToUtf8(s)
    }
  • 相关阅读:
    MVC是什么意思?
    Paypal 在线支付接口应用从零开始,第2节,[支付API原理及流程]
    人人网
    百度框计算研究
    最近总被黑。然后。。发现了很多知识值得学习。。分享出来。
    首次购房契税下调至1% 首付降为20%
    由“百鸡问题”浅谈程序性能
    10月1日起机动车所有人可自行编排车牌号
    08中国互联网大会23在南京开幕
    MySQL联合创始人向Sun递交辞呈
  • 原文地址:https://www.cnblogs.com/nlsoft/p/13565810.html
Copyright © 2011-2022 走看看