VS2015中关于字符集的问题
- 格式:docx
- 大小:235.42 KB
- 文档页数:2
vs2015 字节序转换一、大端字节序和小端字节序大端字节序:一个整数的高位字节(23~31bit)存储在内存的低地址处,低位字节(0~7bit)存储在内存的高地址处。
小端字节序:一个整数的高位字节(23~31bit)存储在内存的高地址处,低位字节(0~7bit)存储在内存的低地址处。
现代PC大多采用小端字节序,因此其又被称为主机字节序。
对应的,大端字节序也称为网络字节序。
二、字节序的转换/* 主机字节序到网络字节序的转换 */unsigned long int htonl(unsigned long int hostLong);unsigned short int htons(unsigned short int hostShort);/* 网络字节序到主机字节序的转换 */unsigned long int ntohl(unsigned long int netLong);unsigned short int ntohs(unsigned short int netShort);补:长整型函数通常用来转换IP地址,短整型函数用来转换端口号。
任何格式化的数据通过网络传输时,都应该使用这些函数来转换字节序。
三、余音绕梁1. 为何网络字节序是大端字节序?当格式化的数据在两台使用不同字节序的主机之间直接传递时,接收端必然错误地解释之。
提出的解决方法是:发送端总是把发送的数据转化成大端字节序数据(小端机转换,大端机不转换)后再发送,于是接收端知道对方传送过来的数据总是采用大端字节序,所以接收端可以根据自身采用的字节序决定是否对接收到的数据进行转换(小端机转换,大端机不转换)。
因此大端字节序也称为网络字节序。
2. 即使你的主机是大端机,最好也在收发数据时进行字节序转换这样写出来的代码可移植性更好这种情况下,字节序转换函数并不会修改数据的字节序3. 确定主机是大端机还是小端机void judge(){union {short s;char c[sizeof(short)];} un;un.s = 0x0102;// 短整数s的高位字节0x01放在内存的低地址处if(un.c[0] == 1 && un.c[1] == 2)printf("big endian\n");// 短整数s的高位字节0x01放在内存的高地址处 else if(un.c[0] == 2 && un.c[1] == 1)printf("little endian\n");elseprintf("unknown...\n");}。
Web开发中的字符集问题和解决方案完全版很多人在开发网站开始阶段没有注意到字符集统一的重要性,因此开发的网站不是数据库中存有乱码就是web页面显示为乱码。
现以web开发中的字符集为主体讨论在个人和团队web开发中需要注意的问题,和相应的解决方法。
1. 常见问题的解决比如我在网站开发阶段就遇到两个严重的问题:我使用的是Zend studio的开发工具,保存代码时也是默认保存的,没有注意到字符集的问题,开始一切正常,但是当我想在页面中添加‟©‟这个符号的时候,网页不能正常显示。
后来发现,zend 默认的保存编码是gb2321编码,而这个编码中不能表示以上那个字符,要显示那个字符有两种方式,一种是使用php中的图形函数,将copyright字符转换为图形显示在网页上。
第二种方法是将网站格式完全转化为utf-8编码。
我采用的是后者,将全部页面保存为utf-8格式,然后在content-type中将charset=转换为utf-8;第二个严重的问题是数据库的乱码问题。
再将文章存入数据库中后,使用phpmyadmin查看其中数据显示的也全部是乱码,起初没有对这个完全正视起来,因为在php使用其中数据时没有出现异常,在网页中显示正常。
但是这本就是个严重的隐患,因此今天想办法解决了,解决方法使用的是很笨的方法,将数据库中的数据读出来,存入表中,然后写一个安装文件(使用php),再连接数据库后,添加一段代码,效果如下:$conn=new mysqli(hostname,username,passwd,dbname);$conn->query(…set names \‟utf8\‟);这样在将php的安装文件中的数据写入数据库时就不会出现编码不一致的问题。
在phpMyadmin中也能正常显示了。
2.原理介绍(摘自阿强的blog:/10458/viewspace_4782.html)1. CollationsCollations翻成中文是“校验”,在网页开发的过程中,这个词汇,只在Mysql里使用,主要作用是指导Mysql对字符的比较,比如, ASCII字符集里,Collations规定了a小于b,a等于a,以及a是否等于A 之类的。
关于字符集和乱码的思考关于字符集和乱码的思考2011-12-12 16:05:58分类:Delphi重要提示:本文并非学术文章,本人也并非语言和文字学领域人士,只是出于好奇心,根据自己的理解写下这篇文章。
本文的参考文档都来源于互联网,而且并未一一考证其准确性和权威性,因此本文仅供参考。
字符集和字符编码的问题一直困扰着我,之间曾经多次尝试把这个问题理解清楚,但始终由于有些细节问题无法自圆其说因而放弃。
网上的资料多数描述过于简单,又或者作者本人对问题也了解不深入,容易产生误导。
最近我终于下定决心将之前对“乱码”问题的思考更进一步,否则将始终是一丝遗憾。
这里也不得不感叹,老外的“科普”做的好啊,网上有很多质量相当高的文章,表述严密,引用充分,例证丰富,我相信在国内各领域的专家也不少,计算机和语言学方面都有很多有建树的大牛,也许是太忙吧。
对我个人而言,最重要的一片文章是“Character set encoding basics”,在本文最后有链接的地址,本人的翻译版本在这里:/space.php?uid=11187&do=b log&id=30344931.字符集的基本概念什么是字符集?什么是字符编码?按照“Character set encoding basics”文中的定义,字符集的编码模型分为以下4个层次1)抽象字符清单Abstract character repertoire (ACR),无序,无编码;2)已编码字符集Coded character set (CCS),有序,有编码;3)字符编码规则Character encoding form (CEF),有序,有编码;4)字符编码方案Character encoding scheme (CES),有序,有编码,有传输和储存规则(字节序);这种分层方式,比较偏于学术化,不太容易理解。
按我个人的理解,GB2312/GBK/GB18030/ASCII这些字符集编码规则,由于都基于8-bit字节,是属于前三层的,可以认为是三层合一。
汉字编码常用字符集-回复汉字编码常用字符集,是指用来表示汉字和其他汉字相关字符的一系列编码规范,其中最为常用的是Unicode(统一码)。
Unicode是一种国际标准,涵盖了世界上几乎所有的文字字符,因此也包含了汉字。
Unicode编码通过为每个字符分配一个唯一的代码点来表示字符。
这些代码点可以是十进制、十六进制或者八进制表示。
在Unicode字符集中,汉字的编码范围为4E00(十六进制)至9FFF(十六进制)。
不同的编码标准采用了不同的转换方案,将Unicode编码转化为实际的二进制数据。
汉字主要有UTF-8、UTF-16和UTF-32这三种常用的编码方式。
UTF-8是一种可变长度的编码方式,它使用1到4个字节来表示一个字符。
对于ASCII字符,UTF-8使用一个字节表示;对于汉字,UTF-8使用三个字节表示。
这种编码方式经济紧凑,适用于在存储和传输上限制空间的应用场景。
UTF-16是一种固定长度的编码方式,它使用两个字节表示一个字符。
对于Unicode代码点小于U+10000的字符,UTF-16中使用一个字节表示;对于Unicode代码点大于U+10000的字符,UTF-16中使用两个字节表示。
UTF-16编码方式用于Java和Windows平台。
UTF-32是一种固定长度的编码方式,它使用四个字节表示一个字符。
UTF-32将每个字符编码为固定长度的32位二进制数。
UTF-32编码方式适用于需要随机访问字符的应用,但由于其空间占用较大,一般不被广泛采用。
除了这些常用的编码方式,还有一些其他的汉字编码标准。
比如GB2312编码,是由中国国家标准局发布的,它包含了7445个简化汉字和拉丁字母、标点符号等字符。
GB2312是一种双字节编码方式,对于一个汉字使用两个字节表示。
随着计算机技术的发展,Unicode编码已经成为最主要的汉字编码标准。
Unicode解决了不同国家、不同编码标准下字符不一致的问题,实现了全球范围内的字符互通。
vs2015 debug条件编译全文共四篇示例,供读者参考第一篇示例:VS2015是微软公司推出的一款集成开发环境,它支持多种语言的开发,其中包括C++、C#、Visual Basic等等。
在软件开发过程中,我们经常会用到Debug和条件编译的功能,这对于快速发现和解决问题非常重要。
本文将介绍如何在VS2015中使用Debug条件编译功能。
我们来介绍一下Debug和条件编译的概念。
Debug是指在开发过程中,通过调试工具对程序进行运行时的动态监视和跟踪,以便及时发现代码中的错误并进行修复。
条件编译则是指根据不同的条件来编译不同的代码。
这有助于在不同的环境下灵活地进行代码调试和运行。
在VS2015中,我们可以通过在代码中插入一些特定的预处理指令来实现条件编译。
最常用的指令是#if、#else和#endif。
我们可以通过以下代码来定义一个DEBUG宏:```#define DEBUG```然后在代码中使用条件编译指令来根据DEBUG宏来控制代码的编译:```cpp#if defined(DEBUG)// debug code#else// release code#endif```在上面的代码中,如果DEBUG宏被定义了,编译器就会编译“debug code”那部分代码;否则,就会编译“release code”。
这种方式可以帮助我们在不同的情况下编译不同的代码,以便进行调试和测试。
除了使用宏来实现条件编译外,VS2015还提供了一些方便的工具来帮助我们在Debug模式下编写代码。
在运行程序时可以设置断点来暂停程序的执行,然后逐步调试每一步。
还可以在代码中插入一些特定的断言来检查一些条件是否成立,帮助我们及时发现潜在的问题。
VS2015还提供了一些高级的调试功能来帮助我们更精确地定位问题。
可以利用监视窗口来查看变量的值;可以使用调用堆栈来跟踪程序的调用流程;还可以使用数据调试器来观察程序运行时的内存状态等等。
Windows下VS2015编译levelDB(nmake)VS2015编译levelDBLeveldb是⼀个google实现的⾮常⾼效的kv数据库,⾮常适合嵌⼊到程序中。
如果有简单的key-value数据库需求,⽽⼜想使⽤⼀个数据库服务的话,levelDB是⾮常合适的。
(BerkeleyDB和forestdb也不错)。
本⽂不适⽤于VS2013及更低版本。
1、下载level源码直接使⽤git克隆⼀个即可git clone https:///google/leveldb.git2、切换到windows分⽀进⼊leveldb⽬录,执⾏下⾯操作git checkout origin/windows现在的leveldb版本是1.19但是Windows版本为1.17。
3、源码修改切换到windows分⽀后,还需要修改两处地⽅。
1、修改db/⽂件打开db/⽂件,将第⼋⾏位置修改如下#ifndef WIN32#include <unistd.h>#endif2、修改port/port.h⽂件在如下代码(17、18⾏)#elif defined(LEVELDB_PLATFORM_ANDROID)# include "port/port_android.h"后⾯添加#elif defined(LEVELDB_PLATFORM_WINDOWS)# include "port/port_win.h"3、修改port/port_win.h⽂件将第四⾏的宏定义给注释掉#define snprintf _snprintf // 注释掉此句因为VS2015中已经实现了snprintf的定义,所以不需要这个了。
如果不去掉,编译的时候将出现以下错误。
cl -c -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zc:throwingNew -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -EHsc -DLEVELDB_PLATFORM_WINDOWS -DOS_WIN -DWIN32 -DWIN64 -DNDEBUG -D port_C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\ucrt\stdio.h(1925): warning C4005: 'snprintf': macro redefinitionD:\work_code\DataServices\3rd\LevelDB\port/port_win.h(34): note: see previous definition of 'snprintf'C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\ucrt\stdio.h(1927): fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration3、添加Makefile.vc⽂件直接拷贝下⾯的内容,在leveldb⽬录下创建Makefile.vc⽂件,粘贴过去。
VS2015下Log4Cplus编译及其使⽤主题概要项⽬实践为windows服务添加log4cplus⽇志库⽂件编辑时间新建20160625序号参考资料1https:///p/log4cplus/wiki/Home/项⽬背景最近在做⼀个OpenCV处理图⽚的程序,需要在windows下建个服务在后台持续进⾏处理。
项⽬虽⼩,五脏俱全。
⽐如以前不太在意的⽇志功能,也要⾃⼰解决。
我的理解,以及接触中的项⽬,⽇志都有下⾯的⼏项功能:1.能快速定位到⽂档中的位置,具体要到⽂件名和⾏号;2.能够控制⽇志的显⽰级别,最好能够在程序运⾏中动态控制,⾄少也能通过更改配置⽂件控制;3.存储控制功能,对于长期运⾏的系统,需要对⽇志⽂件进⾏转储备份,⼤⼩超限后,需要能⾃动删除。
⾃然的选到了Log4系列的Log4cplus系统,花费⼀天时间终于⼤功告成,下⾯及时记录下踩过的坑,避免忘记。
我的环境:VS2015和x64平台;由于项⽬还要兼顾其他代码,不能为了log4cplus更换环境,只能让log4cplus适应这个环境。
开始没注意,也没经验,导致折腾很久。
编译安装从官⽹下载最新版本,https:///projects/log4cplus/files/log4cplus-stable/1.1.3/⽬前的最新版本是log4cplus-1.2.0.7,有意思的是以前的版本1.1.3没有⼀下就编译通过。
解压出来后,log4cplus-1.2.0.7⽬录⾥⾯有个msvc10⽬录,是最顺⼿的编译平台,⽤vs2010打开,⾥⾯有很多项⽬。
实际只要编译log4cplus或就⾏log4cplusS。
根据默认的属性编译,顺利编译成功。
在Win32/bin.Debug⽬录下多出三个库⽂件:log4cplusSD.lib,log4cplusD.lib和log4cplusD.dll。
log4cplusD.lib和log4cplusD.dll两个要结合使⽤,log4cplusSD.lib能做为静态库单独使⽤。
VS2015中的nullable类型是一个很有用的功能。
在C#中,nullable 类型允许我们表示一个数据类型的值,该值可以是正常范围内的数据,也可以是null。
这在某些情况下非常实用,特别是在需要表示缺失值或未知值的情况下。
在使用nullable类型时,我们可以使用“?”操作符来指示一个数据类型是可空的。
int? age = null; 表示age变量可以存储一个整数值,也可以存储null值。
这样的特性在处理数据库查询结果或者用户输入时非常有用,因为我们经常会遇到需要表示缺失值的情况。
另外,使用nullable类型还可以避免一些不必要的错误。
在没有nullable类型的情况下,如果我们要表示一个可能为null的值,通常会使用特定的值(比如-1)来表示null,这样很容易出现逻辑错误。
而使用nullable类型就可以明确地表示一个值是可空的,从而更安全地进行处理。
在实际使用中,nullable类型还可以与其他数据类型进行转换和比较。
我们可以使用“.HasValue”属性来检查一个nullable类型是否有值,也可以使用“.Value”属性来获取其实际数值。
这使得在代码中处理nullable类型变得更加灵活和方便。
VS2015中的nullable类型为我们在处理数据时提供了更多的选择和便利。
它允许我们明确地表示一个值是可空的,避免了一些潜在的逻辑错误,同时也提供了方便的方法来处理可空值。
在我们的实际项目中,合理地运用nullable类型可以提高代码的可靠性和可维护性,是一个非常值得推荐的特性。
在我个人的理解中,nullable类型是一种很好的设计,它为我们提供了一种更加精确和安全地处理数据的方式。
在处理可能为null的值时,nullable类型可以让我们更清晰地表达出我们的意图,避免一些潜在的错误,同时也方便了对可空值的处理。
我个人非常喜欢这一特性,并会在我的项目中充分利用它。
VS2015中的nullable类型为我们提供了一种更加安全和灵活地处理可空值的方式。
vs2015 debug条件编译全文共四篇示例,供读者参考第一篇示例:VS2015 Debug条件编译是指在使用Visual Studio 2015进行调试时,在代码中通过条件编译来控制特定代码块的执行。
在软件开发过程中,条件编译是一种常用的技术,可以根据不同的需求在不同的编译环境下编译出不同的代码。
在调试阶段,通过条件编译可以灵活地控制代码的执行流程,使开发人员更方便地进行调试工作。
在VS2015中,条件编译可以通过使用预处理指令来实现。
在代码中使用#if、#ifdef、#ifndef、#else、#elif和#endif等预处理指令可以控制代码在不同环境下的编译。
在调试环境下,通过设置条件编译宏可以使特定代码块在调试时执行,而在发布版本中不被编译进去,从而帮助开发人员快速定位问题并进行调试。
在进行Debug条件编译时,需要注意以下几点:1. 定义条件编译宏:在项目的属性设置中,可以设置不同的编译配置,如Debug和Release。
在Debug配置中,可以设置特定的条件编译宏,如DEBUG,使代码中包含在#ifdef DEBUG 和#endif之间的代码块会在Debug环境下编译执行。
3. 调试Debug环境下的代码:在Debug环境下,由于条件编译所包含的代码会被编译执行,可以更方便地进行代码调试。
可以设置断点、观察变量值等操作来定位代码问题。
4. 优化Release版本的代码:在Release环境下,不包含调试信息和条件编译宏的代码会被编译执行,可以提高代码的执行效率。
在进行条件编译时,需要注意对Debug和Release版本的代码逻辑进行优化处理。
第二篇示例:VS2015是微软公司推出的集成开发环墶(IDE)软件,它可以帮助开发人员在Windows平台上进行更加方便和高效的软件开发工作。
在进行软件开发过程中,debug(调试)是一个非常重要的步骤,它可以帮助开发人员找出代码中的bug并进行修复。