Linux下UTF-8字符编码问题

2023-05-16

-----------------------------------------这中间选自论坛我份发的帖子------------------------------------------------------------------

地址是:http://topic.csdn.net/u/20101110/17/cab8cfc9-9ac6-47ce-98b4-e503e75e3e48.html?seed=1835214465&r=69782351#r_69782351---------------------------

各位达人,小弟有个问题请教各位,先谢了。

 

情况描述:

目的:写一个一个socket client端程序用于向socke server端发送信息(包括中英文),并接受回复和处理。

已完成:

1. 已完成英文的发送,并接受了server端发回的200 OK数据。 (比如函数如下:sendMyMSG(char *sendBuf,long sendLength))

2. 可以对回复信息进行处理。

3. 根据server端回复确认server接收utf-8编码的数据。

 

问题:

1. 如何向server端发送中文。

2. 我先查了下资料,发现有别人写好的编码转换的函数如下面的GB2312ToUTF8函数。

3. 而linux的默认编码是可以改变为utf-8的.(比如修改/etc/sysconfig/i18n)

4. 是不是我就可以在我的测试程序中将要发到函数sendMyMSG去的字符串之前调用下面的GB2312ToUTF8(或者类似的函数?×××ToUTF8.)我测试结果,还是不行。

 

我也查不到好的办法,不像Java可以直接将要发送的数据直接编码为utf-8,而不管你现在为何种编码。

附:

nt GB2312ToUTF8(char* srcStr, char* desBuff, size_t desBuffLength){

assert(strlen(srcStr)>0);

size_t iLen = strlen(srcStr);

iconv_t cd;

cd = iconv_open("utf-8","gb2312");

assert(cd != 0);

iconv(cd, &srcStr, &iLen, &desBuff, &desBuffLength);

iconv_close(cd); return desBuffLength;}-

---------------------------------------------分隔符----------------------------------------------------------------------------

 

最后解决办法和说明:

1. 因为linux本身默认是utf-8编码。

2. 所以不需要处理就可以将数据发往对方sockerserver了。

3. 只需要在编译的时候加上gcc -finput-charset=GB2312 myfile.c就可以了。

4. 原因在于如果你本身的函数中出现了中文gcc在编译的时候通过-finput-charset=GB2312参数就可以认出来了。

 

PS:

中间走了好多弯路,想附件中的GB2312ToUTF8函数。或者有人提出先将想发送的数据放至unicode编码的字符串然后在将unicode转变成utf8,最后再调用我的接口,事实证明就是绕了一个圈又回到了原地。

经验获取:

1. 了解了字符编码的相关知识。

2. 学习了如何将unicode和utf8的相互转变。

附录:

#include

#include

#include

#include

#include

wchar_t* ConvertUtf8ToUnicode(char* putf8)

{

int i,k,len;

assert(putf8);

len = strlen(putf8);

wchar_t* result = (wchar_t*)malloc(sizeof(wchar_t)*len);

if (result)

{ k = 0; for (i=0;i punicode[i])

{

result[k++] = (char)punicode[i];

}

else

{

result[k++] = (char)(0xe0|(punicode[i]>>12));

result[k++] = (char)(0x80|((punicode[i]>>6)&0x3f));

result[k++] = (char)(0x80|(punicode[i]&0x3f));

}

}

result[k++] = 0;

}

return result;

}

 

  1. char* ConvertUnicodeToUtf8(wchar_t* punicode) 
  2. int i,k,len; 
  3.  
  4. assert(punicode); 
  5. len = wcslen(punicode); 
  6. char* result = (char*)malloc(sizeof(char)*len*3); 
  7. if (NULL != result) 
  8.    k = 0; 
  9.    for (i=0;i<len;i++) 
  10.    { 
  11.     if (0x80 > punicode[i]) 
  12.     { 
  13.      result[k++] = (char)punicode[i]; 
  14.     } 
  15.     else 
  16.     {    
  17.      result[k++] = (char)(0xe0|(punicode[i]>>12)); 
  18.      result[k++] = (char)(0x80|((punicode[i]>>6)&0x3f)); 
  19.      result[k++] = (char)(0x80|(punicode[i]&0x3f)); 
  20.     } 
  21.    } 
  22.    result[k++] = 0; 
  23. return result; 

 

========================================================

我们可以做个试验,使用记事本将“中国 ab”这个中英混杂的字符串以不同编码方式保存为多个“ .txt”文件,然后直接查看其二进制内容:

 图1   比对字符编码


          图 1 展示了“中国 ab”按四种编码方式( ANSI、 UTF8、 Unicode、 Unicode Big Endian )得到的不同二进制数据。

         以英文字符“ a”为例, ANSI和 UTF8得到的数值都是“ 61”,但 Unicode将它扩充为 2个字节 16位的二进制(“ 61 00”和“ 00 61”),所以我们又将这种编码方式称为 UTF-16。

         UTF-16 又可以细分为 2种编码方式: Big Endian方式与 Little_Edian方式,这两者的唯一区别在于字节排列顺序刚好相反, Little_Edian方式将“ a”编码为“ 61 00”,而 Big Endian方式则编码为“ 00 61”。

         现在看看中文字符,“中国”两个汉字, ANSI编码为“ D6 D0 B9 FA”, 4个字节,一个汉字占两个字节,而 UTF8则编码为“ E4 B8 AD E5 9B BD”, 6个字节,一个汉字占 3个字节!这说明 UTF8是一种“变长”的编码,可能使用 1~4个字节来表示某个字符。

         另外,我们看到 UTF8和 Unicode编码(不管是 Big Endian还是 Little Endian )前面都有几个标记字符,这些字符放在文本文件的开头,称为“ BOM( Byte Order Mark,字节顺序标记)”指明了文本的编码方式,以下是 .NET程序中常见的字符编码方式的 BOM值:

 

 

编码

BOM 

UTF-8

EF BB BF

UTF-16   big endian

FE FF

UTF-16   little endian

FF FE

UTF-32   big endian

00 00 FE FF

UTF-32   little endian

FF FE 00 00

 

 

 

         了解了上述基础知识,我们就可以依据 BOM值自动检测字符串的编码方式,从而正确从二进制数据流中解码,以下代码检测文本二进制数据是否采用 UTF8编码:

//  打开文件读取二进制数据 
byte  [] FileContents   =   File.ReadAllBytes(FilePath);
int   filelength   =   FileContents.Length;
//  检测BOM 
if   (FileContents[  0  ]   ==     0xef     &&   FileContents[  1  ]   ==     0xbb  &&   FileContents[  2  ]   ==     0xbf  )
{  
     //  按UTF8解码字符串,注意要排除掉BOM占用的3个字节。 
   String content  =   Encoding.UTF8.GetString( FileContents,   3  , filelength   -     3  );
   Console.WriteLine(content);
}

         其他的编码方式都可以“依样画葫芦”。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下UTF-8字符编码问题 的相关文章

随机推荐

  • LaTEX、 Aurora、 markdown常用数学符号

    在用 LaTEX 的时候 xff0c 公式排版中经常用到各种数学符号 xff0c 平时在编写 word 文档时 xff0c 应用 Aurora 编辑公式时也经常用到 xff0c 就是在CSDN 中用markdwon 编辑公式的时候也要用到
  • 机器人(机械臂)动力学建模方法(Newton-Euler equation)

    牛顿 欧拉公式 xff08 Newton Euler equation xff09 根据中间连杆上的力 力矩平衡关系上推断出来的 它的解具有递归的形式 xff0c 前向递归用于连杆的速度 加速度的传递 xff0c 后向递归用于力的传递 参数
  • 基于重力补偿的 PD 控制

    PD 控制是常规的控制方法 xff0c 设计简单 xff0c 用李雅普诺夫方法证明简单 xff0c 不需要系统的模型 xff0c 是无模型控制中的基本方法 令 q T q T 为系统的状态向量 xff0c 其中 xff1a q 61 q d
  • 矩阵的 Jordan 标准型

    如果把矩阵化成对角矩阵 xff0c 关于矩阵的函数计算问题就会大大简化 但一般的矩阵未必与对角矩阵相似 矩阵的标准型有多重 xff0c Jordan xff08 约当 xff09 标准型是最接近对角矩阵的形式 xff0c 在控制理论中经常用
  • 滑膜控制的基本原理

    滑动模态的定义 人为设定一经过平衡点的相轨迹 xff0c 通过适当设计 xff0c 系统状态点沿着此相轨迹渐近稳定到平衡点 xff0c 或形象地称为滑向平衡点的一种运动 xff0c 滑动模态的 滑动 二字即来源于此 滑模控制的优点 xff1
  • 基于策略的设计 vs 多继承

    基于策略的设计是对多继承的超越 基于策略的设计 xff08 Policy Based Design xff09 包含两个重要的部分 xff1a 策略类 xff08 Policy Classes xff09 和一个具有极大张力的核心 许 多人
  • linux 如何以树形结构显示文件目录结构

    linux 如何以树形结构显示文件目录结构 1 linux 如何显示文件信息 一般可用 ls 命令来查看文件的信息 xff1a ls OPTION FILE 如 xff1a ls 显示所有文件 ls 1 显示所有文件 xff08 按行显示
  • ROS学习(五):package.xml 文件

    package xml 文件 和 manifest 文件类似 xff0c 描述功能包的属性 xff0c 包括功能包的名字 版本号 作者 维护者 通行证 以及所以来的功能包 http wiki ros org catkin package x
  • ROS Gazebo(一):安装与使用

    gazebo 可以主要用来进行机器人动力学的仿真 一 安装和开始 完整安装时已经安装好 xff08 ros kinetic desktop full ros jade desktop full xff0c ros indigo deskto
  • 如何在window系统VS中设置boost编程环境

    在windows系统中设置boost编程非常简单 xff1a 1 下载boost软件包 网址 xff1a http www boost org 最新版 xff1a http www boost org users history versi
  • 个人信用报告机构查询中有:深圳前海微众银行股份有限公司,为什么???

    最近 xff0c 网上各路专家纷纷现身解读新版征信 xff0c 我就查询了一下自己的 xff0c 发现一条被 深圳前海微众银行股份有限公司 查询的记录 xff0c 不理解 xff0c 惊讶带恐慌 随后查询了一下相关的知识 查询报告流程 ht
  • 各种平板显示技术比较

    各种平板显示技术简介 CRT发展历史 CRT xff08 Cathode Ray Tube xff09 即阴极射线管 xff0c 作为成像器件 xff0c 它是实现最早 应用最为广泛的一种显示技术 阴极射线管 xff08 CRT xff09
  • k8s网络与本地开发环境网络互通方案(一)

    现状 k8s集群内是有一套完整网络环境 我们不能直接通过IP访问到k8s集群内的pod 或者service 只能通过nodeport 或者ingress 才能访问到服务 痛点 开发人员进行微服务开发的时候需要通过服务发现进行Pod级服务的直
  • Opencv 3.4 中P3P位姿估计算法解析

    先上图 xff0c Opencv3 4中用两种算法实现P3P位姿估计问题 一种是基于距离P3P算法问题 xff08 算法1 xff1a P3P xff09 xff0c 一种是基于矩阵P3P算法问题 xff08 算法2 xff1a aP3P
  • 套接字

    套接字 socket 套接字 socket 是一个抽象层 应用程序可以通过它发送或接收数据 可对其进行像对文件一样的打开 读写和关闭等操作 套接字允许应用程序将I O插入到网络中 并与网络中的其他应用程序进行通信 网络套接字是IP地址与端口
  • 单片机_PWM输出原理详解

    单片机 PWM输出原理详解 理论篇 博主自己的经历告诉我 xff0c PWM波的理解和应用确实还是挺重要的 xff0c 这里专门花一期详细介绍一下 什么是PWM xff1f PWM xff0c 英文名Pulse Width Modulati
  • 命令远程执行小结

    远程执行命令 xff08 command remote execution xff09 主要可以使用如下几个命令 1 rexec 2 rsh amp rlogin 3 ssh 1 rexec 顾名思义 xff0c 就是remote exec
  • 去除多余的Merge branch提交

    去除多余的Merge branch提交 在项目开发中 xff0c 经常会有这样的情况发生 xff0c 开发完了一个新功能 xff0c 提交到远程仓库时 xff0c 发现提交失败 xff08 其他同事已对其做了更改 xff09 xff0c 先
  • 5 Ways To Fix Slow 802.11n Speed

    http www cnblogs com jjkv3 archive 2012 04 22 2464919 html o you went and bought a shiny new 802 11n router and were all
  • Linux下UTF-8字符编码问题

    这中间选自论坛我份发的帖子 地址是 xff1a http topic csdn net u 20101110 17 cab8cfc9 9ac6 47ce 98b4 e503e75e3e48 html seed 61 1835214465 a