AnyChat技术支持论坛

标题: BRAC_TransBufferEx传输数据乱码 [打印本页]

作者: 淡竹叶    时间: 2015-10-15 20:12
标题: BRAC_TransBufferEx传输数据乱码
您好,咨询个问题,,,我在anychat的web端发送BRAC_TransBufferEx中文数据到服务端,服务端解码String msg = new String(lpBuf, "GBK");可以正常,此时发送给IOS端时,IOS端中文乱码。
此时,我将String msg = new String(lpBuf, "GBK");改为String msg = new String(lpBuf, "UTF-8");后
IOS端anychat发送BRAC_TransBufferEx中文数据到服务端可以正常显示,但是其直接发送到web端中文乱码
这个问题怎么解决?
谢谢

作者: 佰锐科技-李友勤    时间: 2015-10-15 21:31
您好,请问您在将String msg = new String(lpBuf, "GBK");改为String msg = new String(lpBuf, "UTF-8");后,web端发送给ios的中文显示如何呢?
作者: 淡竹叶    时间: 2015-10-16 06:55
佰锐科技-李友勤 发表于 2015-10-15 21:31
您好,请问您在将String msg = new String(lpBuf, "GBK");改为String msg = new String(lpBuf, "UTF-8");后 ...

也是中文乱码的,gbk和utf8,web到ios之间这个通道都是中文乱码,但是服务器接受的,如果是gbk,接受wec端正常ios乱码,如果utf8的话,服务器接受ios正常接受web乱码
作者: admin    时间: 2015-10-16 09:25
您好,BRAC_TransBuffer、BRAC_TransBufferEx是不会对传输内容进行修改的,包括字符集的转换。

您所遇到的乱码主要是由于不同的平台有不同的字符集,如iOS就是UTF-8,而业务服务器可能就是GB2312。

如果您需要在不同平台之间传输中文字符,建议使用文字聊天API接口(BRAC_SendTextMessage),该API接口会自动根据平台进行字符集的转换,避免乱码。
作者: 淡竹叶    时间: 2015-10-17 09:09
admin 发表于 2015-10-16 09:25
您好,BRAC_TransBuffer、BRAC_TransBufferEx是不会对传输内容进行修改的,包括字符集的转换。

您所遇到 ...

您好,那BRAC_TransBufferEx这个通道有没有什么api提供字符集转换呢
作者: 佰锐科技-李友勤    时间: 2015-10-17 11:58
本帖最后由 佰锐科技-李友勤 于 2015-10-17 16:19 编辑
淡竹叶 发表于 2015-10-17 09:09
您好,那BRAC_TransBufferEx这个通道有没有什么api提供字符集转换呢

您好,这个函数是透明通道,透明通道不对业务所处理的数据进行任何干扰的。

您如果在按照您上面的说法,就是说utf-8在web端不支持。

您可以试着在web端再试一下GBK字符集。
作者: 淡竹叶    时间: 2015-10-17 12:36
佰锐科技-李友勤 发表于 2015-10-17 11:58
您好,这个函数是透明通道,透明通道不对业务所处理的数据进行任何干扰的。

您如果在按照您上面的说法 ...

您好,扩展通道在IOS端的回调函数的缓存内容是二进制值,在web端拿到的是字符串格式,能不能说说为什么返回的内容不一致么;
使用BRAC_TransBufferEx直接从web传递内容到ios端,IOS端获取二进制转化成字符串乱码;IOS端使用BRAC_TransBufferEx传递二进制内容(API制定只能传二进制),此时WEB端接收到的回调函数里的缓存地址内容也是乱码的。
作者: 佰锐科技-李友勤    时间: 2015-10-17 13:19
淡竹叶 发表于 2015-10-17 12:36
您好,扩展通道在IOS端的回调函数的缓存内容是二进制值,在web端拿到的是字符串格式,能不能说说为什么返 ...

您好,请确认下您发送数据的编码平台与接收数据的平台编码是一致的。
BRAC_TransBufferEx的缓冲区可以是一个字节数组,或是一个字符串等,也可以是一块内存,传入首地址即可。
您可以参考下相关说明:
如何使用缓冲区及文件传输功能?
作者: 佰锐科技-李友勤    时间: 2015-10-17 13:24
淡竹叶 发表于 2015-10-17 12:36
您好,扩展通道在IOS端的回调函数的缓存内容是二进制值,在web端拿到的是字符串格式,能不能说说为什么返 ...

您好,以下是论坛上一位坛友的代码,您可以对比一下看看有没有问题。但是需要注意接收方和发送方的编码设置一定要一致
ios透明通道使用代码参考
作者: 淡竹叶    时间: 2015-10-17 13:53
佰锐科技-李友勤 发表于 2015-10-17 13:19
您好,请确认下您发送数据的编码平台与接收数据的平台编码是一致的。
BRAC_TransBufferEx的缓冲区可以是 ...

您好,ios端没有gbk,用的是uft-8;而在web端,我的jsp指定的编码是utf-8,你们web端的回调事件中的缓冲地址是不是默认将二进制转化成了gbk或gb2312等编码,否则理论上来说,IOS端发送二进制的数据,web端应该也接收二进制数据吧,但结果是字符串形式
作者: 佰锐科技-李友勤    时间: 2015-10-17 14:37
淡竹叶 发表于 2015-10-17 13:53
您好,ios端没有gbk,用的是uft-8;而在web端,我的jsp指定的编码是utf-8,你们web端的回调事件中的缓冲 ...

您好,透明通道的数据类型没有限制,数据的编码可以在函数中进行自定义的,anychat内核不会对编码进行转换的。
透明通道传输的数据类型也是上层业务自行定义的。anychat不会进行任何处理。可以参考什么是透明通道,如何使用?
您所使用的web端是您自己所写的吗?


作者: 淡竹叶    时间: 2015-10-17 16:02
佰锐科技-李友勤 发表于 2015-10-17 14:37
您好,透明通道的数据类型没有限制,数据的编码可以在函数中进行自定义的,anychat内核不会对编码进行转 ...

您好,是的,web端是我写的,我的回调事件中拿的是字符串,没有指定编码格式,我的jsp环境指定了utf-8的编码格式。
ios端回调事件中拿到的二进制数据,转化为字符串时指定utf-8格式,中文会出现乱码,英文数字则正常。
ios端以utf-8格式发送内容到web端,web端的回调事件直接拿到缓冲区地址内容,英文正常,中文乱码,
你们anychat采用tcp通信时web端的编码格式以什么为主,不能配置编码格式的么
作者: 淡竹叶    时间: 2015-10-17 16:04
佰锐科技-李友勤 发表于 2015-10-17 14:37
您好,透明通道的数据类型没有限制,数据的编码可以在函数中进行自定义的,anychat内核不会对编码进行转 ...

我的意思是web端在anychat长连接通信的通道中的编码格式以什么为主
作者: 淡竹叶    时间: 2015-10-17 16:06
佰锐科技-李友勤 发表于 2015-10-17 14:37
您好,透明通道的数据类型没有限制,数据的编码可以在函数中进行自定义的,anychat内核不会对编码进行转 ...

您说的数据的编码可以在函数中进行自定义的,anychat提供指定编码格式的api?
作者: 佰锐科技-李友勤    时间: 2015-10-17 16:14
淡竹叶 发表于 2015-10-17 16:02
您好,是的,web端是我写的,我的回调事件中拿的是字符串,没有指定编码格式,我的jsp环境指定了utf-8的 ...

您好,
您好,是的,web端是我写的,我的回调事件中拿的是字符串,没有指定编码格式,我的jsp环境指定了utf-8的编码格式。
ios端回调事件中拿到的二进制数据,转化为字符串时指定utf-8格式,中文会出现乱码,英文数字则正常。

这里如果用gbk解码,能否正常呢?
ios端以utf-8格式发送内容到web端,web端的回调事件直接拿到缓冲区地址内容,英文正常,中文乱码,

这里也说明web解码不支持中文,可以查看下浏览器此时是采用什么字符集解码的。
你们anychat采用tcp通信时web端的编码格式以什么为主,不能配置编码格式的么

anychat提供的是数据传输的通道,对于数据的类型与内容没有任何干扰的。上面给您分享的其他客户的代码里面也可以看到他就是自己定义的utf-8编码。

作者: 淡竹叶    时间: 2015-10-18 19:25
佰锐科技-李友勤 发表于 2015-10-17 16:14
您好,
这里如果用gbk解码,能否正常呢?

ios端和服务端回调函数都是byte数组,js端的回调函数中是string,,能否告知怎么转换的
作者: 佰锐科技-邵光清    时间: 2015-10-18 19:52
淡竹叶 发表于 2015-10-18 19:25
ios端和服务端回调函数都是byte数组,js端的回调函数中是string,,能否告知怎么转换的

您好,透明传输通道扩展的回调函数返回的都是缓冲区地址,各个平台都一样的,如果需要在不同平台之间传输中文字符,最好使用文字聊天API接口BRAC_SendTextMessage
作者: 淡竹叶    时间: 2015-10-18 19:56
佰锐科技-邵光清 发表于 2015-10-18 19:52
您好,透明传输通道扩展的回调函数返回的都是缓冲区地址,各个平台都一样的,如果需要在不同平台之间传输 ...

由于文字聊天API接口BRAC_SendTextMessage需要进入房间操作,而我们的需求是不进入房间能够文字聊天的。
作者: 佰锐科技-李友勤    时间: 2015-10-18 20:07
淡竹叶 发表于 2015-10-18 19:56
由于文字聊天API接口BRAC_SendTextMessage需要进入房间操作,而我们的需求是不进入房间能够文字聊天的。

您好,您的数据是怎样接收的呢?请将相关代码贴上来分析下。
您前面说jsp环境,是不是说您的页面是在部署的容器里呢?
如果是这样的话,页面的数据交给服务器,在客户端浏览器以页面指定编码转给服务器以后,目前的服务器开发环境默认都会以8859-1进行解码并响应,这样的话中文字符肯定是不支持,需要在serverlet里面指定接收的编码才能正常的。
作者: 淡竹叶    时间: 2015-10-18 21:35
佰锐科技-李友勤 发表于 2015-10-18 20:07
您好,您的数据是怎样接收的呢?请将相关代码贴上来分析下。
您前面说jsp环境,是不是说您的页面是在部 ...

项目部署在tomcat中,在jsp页面上<%@ page language="java" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="${ctx }/js/main.js" charset="UTF-8"></script>
项目中
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

这时候mainjs发送文字:
//dwUserId为o表示发送给服务器
        var errorcode = BRAC_TransBufferEx(0,getVal,mTargetUserId,TYPE_TXT,0);
        //发送给用户端
        var errorcode2 = BRAC_TransBufferEx(mTargetUserId,getVal,mTargetUserId,TYPE_TXT,0);

通过BRAC_TransBufferEx(0,,,第一个参数为0发服务端,
此时服务端
    public void OnAnyChatTransBufferEx(int dwUserId, byte[] lpBuf, int dwLen, int wParam, int lParam, int dwTaskId) {
        try {
            //保存发送的消息到服务器中
            String msg = new String(lpBuf, "UTF-8");
            String msg2 = new String(lpBuf, "GBK");

msg乱码,而msg2正常。。
var errorcode2 = BRAC_TransBufferEx(mTargetUserId,getVal,mTargetUserId,TYPE_TXT,0);发给IOS端,那边接收到的二进制转化为字符串(utf-8)也是乱码的
作者: 淡竹叶    时间: 2015-10-18 21:38
佰锐科技-李友勤 发表于 2015-10-18 20:07
您好,您的数据是怎样接收的呢?请将相关代码贴上来分析下。
您前面说jsp环境,是不是说您的页面是在部 ...

您好,另外,,web端给ios端发送透明扩展通道,这应该是p2p的长链接吧,,和服务器有关系么,和核心服务有关么,核心服务应该也不会影响传输的字符编码
作者: 佰锐科技-邵光清    时间: 2015-10-18 22:01
本帖最后由 佰锐科技-邵光清 于 2015-10-18 22:08 编辑
淡竹叶 发表于 2015-10-18 21:38
您好,另外,,web端给ios端发送透明扩展通道,这应该是p2p的长链接吧,,和服务器有关系么,和核心服务 ...

您好,AnyChat SDK不理会使用透明通道扩展传送的数据编码;另外BRAC_TransBufferEx是使用UDP发送数据,不保证发送顺序和接收顺序相同,但保证能收到。请问您是什么业务场景需要在房间外使用缓冲区传输数据呢?

作者: 淡竹叶    时间: 2015-10-19 08:33
佰锐科技-邵光清 发表于 2015-10-18 22:01
您好,AnyChat SDK不理会使用透明通道扩展传送的数据编码;另外BRAC_TransBufferEx是使用UDP发送数据,不 ...

部分代码已贴上,,我们是嵌在app里面的,web端一对多,,只要上线就能与其对话
作者: 佰锐科技-李永星    时间: 2015-10-19 09:10
淡竹叶 发表于 2015-10-19 08:33
部分代码已贴上,,我们是嵌在app里面的,web端一对多,,只要上线就能与其对话

您好,如你1楼所述,ios端你也应该使用 "GBK"编码来处理透明数据,透明通道其实就是一个数据的管道,你在发送端是什么编码,在接收端也需要这样的编码,这样才不会出现乱码。
作者: 佰锐科技-李友勤    时间: 2015-10-19 09:26
淡竹叶 发表于 2015-10-19 08:33
部分代码已贴上,,我们是嵌在app里面的,web端一对多,,只要上线就能与其对话
此时服务端
    public void OnAnyChatTransBufferEx(int dwUserId, byte[] lpBuf, int dwLen, int wParam, int lParam, int dwTaskId) {
        try {
            //保存发送的消息到服务器中
            String msg = new String(lpBuf, "UTF-8");
            String msg2 = new String(lpBuf, "GBK");

msg乱码,而msg2正常。。


您好,这一段说明您的utf-8编码没有成功?您把页面以及js的utf-8统一换成大写或者小写试试看。
前面说的服务器是指web服务器,具体来说是serverlet里面的service中需要指定请求对象的字符集,否则默认都是以8859-1编码,不过您的gbk能成功说明应该不是这个问题。




欢迎光临 AnyChat技术支持论坛 (http://bbs.anychat.cn/) Powered by Discuz! X3