V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
morty961
V2EX  ›  Go 编程语言

请教字节流里 c++的 TCHAR 怎么转成 go 的 string 啊?

  •  
  •   morty961 · 2019-10-08 11:48:15 +08:00 · 2826 次点击
    这是一个创建于 1858 天前的主题,其中的信息可能已经有所发展或是发生改变。
    和别人对接项目,用 websocket 传输数据,对方是 c++的,直接用结构体这种序列化方式。
    tchar 怎么转换 go 的 string 呢? go 的 string 又怎么转换成 tchar 呢?
    c++那边使用 unicode,tchar 大小为 2
    我不会 c++,底层比较薄弱。请教下各位大佬
    解决的可以发个红包答谢
    koebehshian
        1
    koebehshian  
       2019-10-08 11:59:44 +08:00 via Android
    go 的 string 是 utf-8,windows 上的 cplusplus 的 tchar 定义了_UNICODE 宏之后是 uft-16,没定义是操作系统本地的编码(中文简体系统是 gbk )
    koebehshian
        2
    koebehshian  
       2019-10-08 12:05:24 +08:00 via Android
    最简单的方法是约定一种编码,传输汉字编码的十六进制字符串,而不是十六进制值,也就是纯 ascii 码,发送方编码,接收方解码,类似网页图片用 base64
    koebehshian
        3
    koebehshian  
       2019-10-08 12:09:59 +08:00 via Android
    go 标准库 unicode/utf16 有个 Encode 函数,把 uft-32 转成 utf-16, go 中的字符串能直接显式转成[]rune 类型
    WinCloud
        4
    WinCloud  
       2019-10-08 12:21:33 +08:00 via Android
    给个小建议,网络传字符尽量用 utf-8,后面能少好多问题。
    TCHAR 本身是 Win32 下的宏定义,字节数和编码不确定,不建议直接用在网络或者文件相关的模块上。
    GeruzoniAnsasu
        5
    GeruzoniAnsasu  
       2019-10-08 12:46:14 +08:00 via Android   ❤️ 1
    TCHAR 是个宏,用来控制使用 char 还是 wchar_t 作为字符类型。


    然而……
    用哪种 char 作为字符类型并不能代表字符串用哪种编码格式储存
    用哪种 char 作为字符类型并不能代表字符串用哪种编码格式储存
    用哪种 char 作为字符类型并不能代表字符串用哪种编码格式储存



    也就是说,完全可以用单字节 char string 来存变长编码 unicode ( utf8 ),也可以用单字节 char string 存(伪)定长编码 utf16 ;也可以用 wchar_t 去存 utf16 这样一般一个 wchar_t 刚好能放一个 utf16 的编码序列……微软曾是这么想的但现在证明想法很蠢。

    对于完全不需要跟 windows API 打交道的数据,应当一律使用单字节字符 char 类型并采用 utf8 编码来存储字符串。当要使用 windows API 时转成 utf16。

    如果对方的代码不用到 windowsAPI (尤其指 xxxA 和 xxxW 有区别的 API 如 MessageBoxW ),那么只用 ANSI 字符编译的版本也就是 TCHAR 定义为 char 的版本也不会有问题。

    当然一般不是这种情况

    另一种情况 TCHAR 被定义成 wchar_t,使用 utf16 编码,但在内存层面来看并不需要知道一个字符被定义成了多大,byte 序列都是一样的,把整段内存以 utf16 的方式 decode 即可
    reus
        6
    reus  
       2019-10-08 12:53:09 +08:00 via Android
    叫他改成 json,不折腾
    jimrok
        7
    jimrok  
       2019-10-08 13:07:44 +08:00
    要看对方平台用什么方式编码,GBK,UTF8 都会导致不同的解码方式。建议在异构平台下都按照 protobuf 进行编码。
    nicebird
        8
    nicebird  
       2019-10-08 13:45:14 +08:00
    上 protobuf\json\xml
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4346 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:06 · PVG 12:06 · LAX 20:06 · JFK 23:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.