在Linux的终端中显示BMPString的内容
在上一篇博文中,介绍了怎样在 Windows 的控制台界面下输出 BMPString 的内容,可是那里的方法在 Linux 下不适用。假设将那里的演示样例代码放到 Linux 下运行。输出的结果为乱码。产生乱码的原因在于 wchar_t 类型的变量在 Windows 下和 Linux 下的字节长度不同。
下面 C 程序在 Windows 和 Linux 下都可以运行:
- #include <stdio.h>
- #include <wchar.h>
- #if defined(_WIN32) || defined(_WIN64)
- #include <stdlib.h>
- #endif
- int main(void)
- {
- printf("wide character (wchar_t type) length is %d bytes.\n", sizeof(wchar_t));
- #if defined(_WIN32) || defined(_WIN64)
- system("pause");
- #endif
- return 0;
- }
输出结果是不同的。
在 64 位 Windows 下。用微软的编译器将其分别编译成 32 位和 64 位可运行程序,输出结果证明 wchar_t 类型变量长度为 2 字节。
在 64 位 Linux 下。用 64 位的 GCC 编译后运行,输出结果证明 wchar_t 类型变量长度为 4 字节。
在 Windows 下处理 BMPString 时,比方对于字符“中”,相应的 UTF-16 编码是0x4E, 0x2D,我们处理的方法是将其由 big-endian 顺序转换为 little-endian 顺序,再用 wprintf() 函数输出。
在 Linux 下处理 BMPString 时。比方对于字符“中”。相应的 UTF-16 编码是0x4E, 0x2D,我们处理的方法是将其由 2 字节长扩展到 4 字节长,扩展时新加入的两个字节的值为 0。即变为 0x0, 0x0, 0x4E, 0x2D。再由 big-endian 顺序转换为 little-endian 顺序,即编码变成 0x2D, 0x4E, 0x0, 0x0。再用 wprintf() 函数输出。
所以在 Linux 下要显示 BMPString,一般方法是先将 UTF-16 big-endian 方式的字符编码扩展为 UTF-32 big-endian 方式的字符编码,扩展方法是在前面加上两个字节的 0。再将UTF-32 big-endian 方式的字符编码变为 UTF-32 little-endian 方式的字符编码。(也可先将 UTF-16 big-endian 方式的字符编码转换为 little-endian 顺序,再给后面加上两个字节的 0。效果是一样的。)
以下给出一个演示样例程序:
- /**************************************************
- * Author: HAN Wei
- * Author's blog: http://blog.csdn.net/henter/
- * Date: Oct 31th, 2014
- * Description: demonstrate how to print BMPString
- on Linux console
- **************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <locale.h>
- #include <wchar.h>
- /**************************************************
- *函数名称:PrintBMPStringOnLinux
- *功能: 在 Linux 终端下输出 BMPString
- *參数:
- BMPString [in]
- BMPString_len [in] BMPString 的长度,以字节为单位
- *返回值:
- 0 成功
- -1 失败
- **************************************************/
- int PrintBMPStringOnLinux(unsigned char *BMPString, unsigned int BMPString_len)
- {
- unsigned char *buffer;
- unsigned int buffer_len, i;
- unsigned char *p, *q;
- buffer_len = BMPString_len * 2 + 4; /* 缓冲区大小为 BMPString 的字节长度的两倍
- 再加上四个字节。这四个字节用来存放字符串
- 结束符 \0(其类型为 wchar_t ),其相应
- 编码是 0x0, 0x0, 0x0, 0x0 */
- if ( !(buffer = (unsigned char *)malloc(buffer_len)) )
- {
- #ifdef _DEBUG
- printf("malloc() function failed!\n");
- #endif
- return (-1);
- }
- memset(buffer, 0, buffer_len);
- p = buffer;
- q = BMPString;
- for (i=0; i < (int)BMPString_len/2; i++)
- {
- *p = *(q+1);
- *(p+1) = *q;
- p += 4;
- q += 2;
- }
- setlocale(LC_ALL, "zh_CN.utf8");
- wprintf(L"BMPString: %ls\n", (wchar_t *)buffer);
- free(buffer);
- return 0;
- }
- int main(void)
- {
- int error_code;
- unsigned char BMPString_data1[]={0x4e, 0x2d, 0x56, 0xfd}; /* 中文字符串"中国"相应的 Unicode 编码 */
- unsigned char BMPString_data2[]={0x0, 0x55, 0x0, 0x73, 0x0, 0x65, 0x0, 0x72}; /* 英文字符串"User"相应的 Unicode 编码 */
- char str[]={0x2d, 0x4e, 0x0, 0x0, 0xfd, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
- if ( error_code = PrintBMPStringOnLinux(BMPString_data1, sizeof(BMPString_data1)) )
- {
- printf("Print BMPstring on Windows console failed!\n");
- return (-1);
- }
- if ( error_code = PrintBMPStringOnLinux(BMPString_data2, sizeof(BMPString_data2)) )
- {
- printf("Print BMPstring on Windows console failed!\n");
- return (-1);
- }
- /* 以下给出了说明 unicode 编码的字符在 Linux 中是怎样存放的一个样例,
- 从显示结果能够看出:对于每个用 wchar_t 类型保存的 UTF-16 字符,
- 长度为 4 字节。以 little-endian 顺序存放 */
- printf("\n");
- setlocale(LC_ALL, "zh_CN.utf8");
- wprintf(L"%ls\n", (wchar_t *)str);
- return 0;
- }
该程序在 64 位 CentOS 下,用 64位 GCC 编译器编译后运行。输出结果例如以下图:
在Linux的终端中显示BMPString的内容的更多相关文章
- 在Windows的控制台和Linux的终端中显示加载进度
Windows中 #include <stdio.h> #include <windows.h> int main() { ;//任务完成总量 int i; ; i < ...
- 使用 Sixel 图形格式在终端中显示缩略图
不久前,我们讨论了 Fim,这是一个轻量级的命令行图像查看器应用程序,用于从命令行显示各种类型的图像,如 bmp.gif.jpeg 和 png 等.今天,我偶然发现了一个名为 lsix的类似工具.它类 ...
- 【转载】在Windows终端中显示UTF-8字符
一直苦恼于如何在Windows终端中显示UTF-8字符的问题.比如,在MySQL命令行下,如果数据库的编码是UTF-8,那么,在查询数据库的时候,里面的中文都会变成乱码.今天半无意的搜索了一下,结果发 ...
- repeter 控制一行中显示几条内容
repeter 控制一行中显示几条内容 <asp:Repeater ID="Repeater1" runat="server" DataSourceID ...
- 如何在浏览器网页中显示word文件内容
如何在浏览器网页中显示word文件内容 把word文件读到byte[]中,再Response.OutputStream.Write(bytes)到客户端去 Page_Load事件中写: //FileS ...
- linux 命令终端提示符显示-bash-4.1#解决方法
昨天在配置linux,突然发现root登录的CRT的终端提示符显示的是-bash-4.1# 而不是root@主机名 + 路径的显示方式.搞了半天也不知道为什么出现这种情况.今天终于搞定这个问题, 原因 ...
- linux 命令终端提示符显示-bash-4.2#解决方法
原地址:http://blog.csdn.net/liulihui1988/article/details/52796395 终端提示符显示的是-bash-4.2# 而不是root@主机名 + 路径的 ...
- linux在终端中按下键盘立马反应
想在终端中做个小应用,按下上下左右键能立刻作出反应. 测试程序见下: 1 #include <stdio.h> 2 #include <unistd.h> 3 #include ...
- 如何让同一个字段在不同的view中显示不同的内容
many2one 字段默认显示 对象的name字段, 但也可以定义name_get方法显示不同的内容 如res.partner 对象可以根据 context 内容是否显示 客户的地址,职位,email ...
随机推荐
- React 中的 refs的应用
React Refs React 支持一种非常特殊的属性 Ref ,你可以用来绑定到 render() 输出的任何组件上. 这个特殊的属性允许你引用 render() 返回的相应的支撑实例( back ...
- angular-resource
上一篇中讲到使用$http同服务器进行通信,但是功能上比较简单,angularjs还提供了另外一个可选的服务$resource,使用它可以非常方便的同支持restful的服务单进行数据交互. 安装 n ...
- nodejs 中使用 ftp
转自原文 nodejs 中使用 ftp 1. npm install ftp 项目 https://github.com/mscdex/node-ftp 2. 转自 http://www.open ...
- 多本Web前端深度修炼书籍(提供网盘下载链接)
书籍介绍:这本书涵盖了html5新增标签和功能,而且提供了jquerymobile,Phonegap,Sencha Touch框架的介绍和应用,最后还带了一个移动web应用的样例,绝对是移动web开发 ...
- atitit。企业组织与软件project的策略 战略 趋势 原则 attilax 大总结
atitit. 企业组织与软件project的策略 战略 趋势 原则 attilax 大总结 1. 战略规划,适当的过度设计 1 2. 跨平台化 1 3. 可扩展性高于一切 1 4. 界面html5化 ...
- pip安装selenium时提示Unknown or unsupported command 'install'
安装流程: 1.安装Python34 2.安装pip 下载setuptoos并安装,然后输入:easy_install pip 然后 配置path:C:\Python34\Scripts 3安装sel ...
- perl getopt 用法
我们在linux经常常使用到一个程序须要增加參数,如今了解一下perl中的有关控制參数的函数.getopt.在linux有的參数有二种形式.一种是--help,还有一种是-h.也就是-和--的分别.- ...
- zzulioj--1711--漂洋过海来看你(dfs+vector)
1711: 漂洋过海来看你 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 89 Solved: 33 SubmitStatusWeb Board D ...
- 创建ios界面的三步骤
1.加载数据 (包括懒加载和字典转模型等) 2.搭建界面 (常见的有九宫格算法和for循环的嵌套等) 3.实现用户交互 (通常用按钮实现)
- Android UnitTest FrameWork
Android test suites基于Junit,可以直接使用Junit测试不使用android api的class,也可以使用android的Junit extensions测试android ...