积木

No sub title

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

文章转自:http://blog.sina.com.cn/s/blog_69e905cd0100ks5v.html

第一种方法:

 TiXmlDocument *pDoc=new TiXmlDocument; //定义一个文档的指针
 
//添加一个xml头。
 TiXmlDeclaration *pDeclaration=new TiXmlDeclaration("1.0","UTF-8","");
 pDoc->LinkEndChild(pDeclaration);
 //添加XMl的根节点
 TiXmlElement *lengquan= new TiXmlElement("lengquan");
 pDoc->LinkEndChild(lengquan);
 //添加一个父节点
 TiXmlNode *parent= new TiXmlElement("qiu");
 TiXmlNode* name4NewNode = new TiXmlElement("name");
 parent->InsertEndChild(*name4NewNode)->InsertEndChild(TiXmlText("pipi")); 
 TiXmlNode* addr4NewNode = new TiXmlElement("addr");
 parent->InsertEndChild(*addr4NewNode)->InsertEndChild(TiXmlText("Shaanxi Xianyang"));
 TiXmlNode* tel4NewNode = new TiXmlElement("tel");
 parent->InsertEndChild(*tel4NewNode)->InsertEndChild(TiXmlText("02937310627"));
 TiXmlNode* email4NewNode = new TiXmlElement("email");
 parent->InsertEndChild(*email4NewNode)->InsertEndChild(TiXmlText(lengshijie@163.com));
 lengquan->InsertEndChild(*parent);   


 pDoc->SaveFile("lengquan.xml");

第二种方法:

// TODO: Add your control notification handler code here
 TiXmlDocument *pDoc=new TiXmlDocument; //定义一个文档的指针
 
//添加一个xml头。
 TiXmlDeclaration *pDeclaration=new TiXmlDeclaration("1.0","UTF-8","");
 pDoc->LinkEndChild(pDeclaration);
 //添加XMl的根节点
 TiXmlElement *lengquan= new TiXmlElement("lengquan");
 pDoc->LinkEndChild(lengquan);
 //添加xml父节点,其实父节点跟子节点一样,这里为了我自己明白的更清楚一点,所以我自己称根节点的下一结点为父节点。
 TiXmlElement *parent=new TiXmlElement("qiu");
 lengquan->LinkEndChild(parent);
 //添加属性
 parent->SetAttribute("time","12:10");

 //添加子节点。
 TiXmlElement *name4NewNode=new TiXmlElement("name");
 parent->LinkEndChild(name4NewNode);
 //添加节点下文本
 CString strName="pipi";
 TiXmlText *pNameValue=new TiXmlText(strName);
 name4NewNode->LinkEndChild(pNameValue);
 
 //
 TiXmlElement* addr4NewNode=new TiXmlElement("addr");
 parent->LinkEndChild(addr4NewNode);

 CString strAddr="Shaanxi Xianyang";
 TiXmlText *pAddrValue=new TiXmlText(strAddr);
 parent->LinkEndChild(pAddrValue);
 //
 TiXmlElement* tel4NewNode=new TiXmlElement("tel");
 parent->LinkEndChild(tel4NewNode);

 CString strTel="02937310627";
 TiXmlText *pTelValue=new TiXmlText(strTel);
 parent->LinkEndChild(pTelValue);

 //保存
 pDoc->SaveFile("lengquan1.xml");

 

相对而言我更趋向于第二种写法。
posted @ 2014-03-24 17:59 Jacc.Kim 阅读(693) | 评论 (0)编辑 收藏

文章转自:http://blogger.org.cn/blog/more.asp?name=hongrui&id=28011
windows平台下使用vc或gcc
函数名: access
功  能: 确定文件的访问权限
用  法: 
int access(const char *filename, int amode); 文件的话还可以检测读写权限,文件夹的话则只能判断是否存在
#include 
"stdafx.h"
#include  
<io.h>
#include  
<stdio.h>
#include  
<stdlib.h>

void main( void )
{
   
/* Check for exist */
   
if( (_access( "C:\\windows"0 )) != -1 )
   {
      printf( 
"windows exists " );
     
      
   }
}
其实判断文件存在fopen就行了。
linux下或者gcc下
#include 
<stdio.h>
#include 
<stdlib.h>

#include 
<dirent.h>
#include 
<unistd.h>
void main( void )
{
 DIR 
*dir = NULL;
     
/* Open the given directory, if you can. */  
    dir 
= opendir( "C:\\windows" );
     
if( dir != NULL ) {
         printf( 
"Error opening " );
         
return ;
     }
}
opendir() 返回的 DIR 指针与 fopen() 返回的 FILE 指针类似,它是一个用于跟踪目录流的操作系统特定的对象。
使用c
++标准库
#include 
"stdafx.h"
#include 
<iostream>
#include 
<fstream>
using namespace std;
#define FILENAME  "C:\\windows"
int main()
{
     fstream file;
     file.open(FILENAME,ios::
in);
     
if(!file)
     {
         cout
<<FILENAME<<"存在";
      }
      
else
      {
          cout
<<FILENAME<<"不存在";
      }
      
return 0;
}
gcc编译去掉#include 
"stdafx.h"即可
使用Windows API PathFileExists

#include 
"stdafx.h"
#include 
<iostream>
#include 
<windows.h>
#include 
<shlwapi.h>
#pragma   comment(lib,
"shlwapi.lib"
using namespace std;
#define FILENAME  "C:\\windows"
int main()
{
      
if (::PathFileExists(FILENAME))
       cout
<<"exist";
    
return 0;
}

注意windows.h 一定要在shlwapi.h前面定义
使用boost的filesystem类库的exists函数:

#include 
<boost/filesystem/operations.hpp>
#include 
<boost/filesystem/path.hpp>
#include 
<boost/filesystem/convenience.hpp>

int GetFilePath(std::string &strFilePath)
{
    
string strPath;
    
int nRes = 0;

    
//指定路径

    strPath 
= "D:\myTest\Test1\Test2";
    
namespace fs = boost::filesystem;

    
//路径的可移植

    fs::path full_path( fs::initial_path() );
    full_path 
= fs::system_complete( fs::path(strPath, fs::native ) );
    
//判断各级子目录是否存在,不存在则需要创建

    
if ( !fs::exists( full_path ) )
    {
        
// 创建多层子目录

        
bool bRet = fs::create_directories(full_path);
        
if (false == bRet)
        {
            
return -1;
        }

    }
    strFilePath 
= full_path.native_directory_string();

    
return 0;
}


posted @ 2014-03-23 21:27 Jacc.Kim 阅读(3413) | 评论 (0)编辑 收藏

1) 首先需要有andorid sdk包,因为里面有adb工具。同时建议将adb工具所在的目录添加到系统环境变量中。
2) 将设备连接到电脑上。
3) 将dump_syms传入设备上。命令:adb push xxxxxxxx\xxxx\dump_syms /data/local/tmp
4) 将.so文件传入设备上。命令:adb push xxxx\xxxx\xxx.so /sdcard/libgame.so
5) 将dump_syms文件置为可读写。命令:chmod 0777 /data/local/tmp/dump_syms
6) 用dump_syms解析.so文件。命令:
      adb shell
      cd /data/local/tmp
      ./dump_syms /sdcard/libgame.so > /sdcard/libgame.so.sym
      exit
7) 将解析出来的符号文件提取出来。命令:adb pull /sdcard/libgame.so.sym xxxx\xxxx
8) 用ue等工具,将提取出来的符号文件打开,里面有指纹识别信息。以此指纹信息建立目录。然后将该符号文件放在该目录下。最后再将该目录放到libgame.so目录下
9) 用解析出来的符号文件,将相关的dump文件解析出来。命令:minidump_stackwalk.exe 6b4f6cbf-c474-eb78-68ee3e30-3f77c3ba.dmp D:\symbols > D:\dump\6b4f6cbf-c474-eb78-68ee3e30-3f77c3ba.dmp.txt
posted @ 2014-01-29 17:42 Jacc.Kim 阅读(3087) | 评论 (0)编辑 收藏

原谅转自:

该文章介绍的不错,值得收藏。

最近有一些朋友常问我一些乱码的问题,和他们交流过程中,发现这个编码的相关知识还真是杂乱不堪,不少人对一些

知识理解似乎也有些偏差,网上百度,google的内容,也有不少以讹传讹,根本就是错误的(例如说 unicode编码是两

个字节),各种软件让你选择编码的时候,常常是很长的一个选单,让用户不知道该如何选。基于这样的问题,我就写

下我的理解吧,一方面帮助一些需要帮助的人纠正认识,一方面作为自己以后备查的资料。

1.ASCII(American Standard Code for Information Interchange)
  美国信息交换标准代码,这是计算机上最早使用的通用的编码方案。那个时候计算机还只是拉丁文字的专利,根本没

有想到现在计算机的发展势头,如果想到了,可能一开始就会使用unicode了。当时绝大部分专家都认为,要用计算机

,必须熟练掌握英文。这种编码占用7个Bit,在计算机中占用一个字节,8位,最高位没用,通讯的时候有时用作奇偶

校验位。因此ASCII编码的取值范围实际上是:0x00-0x7f,只能表示128个字符。后来发现128个不太够用,做了扩展,

叫做ASCII扩展编码,用足八位,取值范围变成:0x00-0xff,能表示256个字符。其实这种扩展意义不大,因为256个字

符表示一些非拉丁文字远远不够,但是表示拉丁文字,又用不完。所以扩展的意义还是为了下面的ANSI编码服务。

2.ANSI(American National Standard Institite )
  美国国家标准协会,也就是说,每个国家(非拉丁语系国家)自己制定自己的文字的编码规则,并得到了ANSI认可,

符合ANSI的标准,全世界在表示对应国家文字的时候都通用这种编码就叫ANSI编码。换句话说,中国的ANSI编码和在日

本的ANSI的意思是不一样的,因为都代表自己国家的文字编码标准。比如中国的ANSI对应就是GB2312标准,日本就是

JIT标准,香港,台湾对应的是BIG5标准等等。当然这个问题也比较复杂,微软从95开始,用就是自己搞的一个标准GBK

。GB2312里面只有6763个汉字,682个符号,所以确实有时候不是很够用。GBK一直能和GB2312相互混淆并且相安无事的
一个重要原因是GBK全面兼容GB2312,所以没有出现任何冲突,你用GB2312编码的文件通过GBK去解释一定能获得相同的

显示效果,换句话说:GBK对GB2312就是,你有的,我也有,你没得的,我还有!


好了,ANSI的标准是什么呢,首先是ASCII的代码你不能用!也就是说ASCII码在任何ANSI中应该都是相同的。其他的,

你们自己扩展。所以呢,中国人就把ASCII码变成8位,0x7f之前我不动你的,我从0xa0开始编,0xa0到0xff才95个码位

,对于中国字那简直是杯水车薪,因此,就用两个字节吧,因此编码范围就从0xA1A1 - 0xFEFE,这个范围可以表示

23901个汉字。基本够用了吧,GB2312才7000多个呢!GBK更猛,编码范围是从0x8140 - 0xFEFE,可以表示3万多个汉字

。可以看出,这两种方案,都能保证汉字头一个字节在0x7f以上,从而和ASCII不会发生冲突。能够实现英文和汉字同

时显示。
BIG5,香港和台湾用的比较多,繁体,范围: 0xA140 - 0xF9FE, 0xA1A1 - 0xF9FE,每个字由两个字节组成,其第一

字节编码范围为0xA1~0xF9,第二字节编码范围为0x40-0x7E与0xA1-0xFE,总计收入13868个字 (包括5401个常用字、

7652 个次常用字、7个扩充字、以及808个各式符号)。


那么到底ANSI是多少位呢?这个不一定!比如在GB2312和GBK,BIG5中,是两位!但是其他标准或者其他语言如果不够

用,就完全可能不止两位!

例如:GB18030:
GB18030-2000(GBK2K)在GBK的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。GBK2K从根本上解决了字位

不够,字形不足的问题。它有几个特点:它并没有确定所有的字形,只是规定了编码范围,留待以后扩充。
编码是变长的,其二字节部分与GBK兼容;四字节部分是扩充的字形、字位,其编码范围是首字节0x81-0xfe、二字节

0x30-0x39、三字节0x81-0xfe、四字节0x30-0x39。它的推广是分阶段的,首先要求实现的是能够完全映射到

Unicode3.0标准的所有字形。它是国家标准,是强制性的。

搞懂了ANSI的含义,我们发现ANSI有个致命的缺陷,就是每个标准是各自为阵的,不保证能兼容。换句话说,要同时显

示中文和日本文或者阿拉伯文,就完全可能会出现一个编码两个字符集里面都有对应,不知道该显示哪一个的问题,也

就是编码重叠的问题。显然这样的方案不好,所以Unicode才会出现!

3.MBCS(Multi-Byte Chactacter System(Set))
  多字节字符系统或者字符集,基于ANSI编码的原理上,对一个字符的表示实际上无法确定他需要占用几个字节的,只

能从编码本身来区分和解释。因此计算机在存储的时候,就是采用多字节存储的形式。也就是你需要几个字节我给你放

几个字节,比如A我给你放一个字节,比如"中“,我就给你放两个字节,这样的字符表示形式就是MBCS。
在基于GBK的windows中,不会超过2个字节,所以windows这种表示形式有叫做DBCS(Double-Byte Chactacter System

),其实算是MBCS的一个特例。
C语言默认存放字符串就是用的MBCS格式。从原理上来说,这样是非常经济的一种方式。
4.CodePage
  
代码页,最早来自IBM,后来被微软,oracle ,SAP等广泛采用。因为ANSI编码每个国家都不统一,不兼容,可能导致冲

突,所以一个系统在处理文字的时候,必须要告诉计算机你的ANSI是哪个国家和地区的标准,这种国家和标准的代号(

其实就是字符编码格式的代号),微软称为Codepage代码页,其实这个代码页和字符集编码的意思是一样的。告诉你代

码页,本质就是告诉了你编码格式。
但是不同厂家的代码页可能是完全不同,哪怕是同样的编码,比如, UTF-8字符编码 在IBM对应的代码页是1208,在微

软对应的是65001,在德国的SAP公司对应的是 4110 。所以啊,其实本来就是一个东西,大家各自为政,搞那么多新名

词,实在没必要!所以标准还是很重要的!!!
比如GBK的在微软的代码页是936,告诉你代码页是936其实和告诉你我编码格式是GBK效果完全相同。那么处理文本的时

候就不会有问题,不会去考虑某个代码是显示的韩文还是中文,同样,日文和韩文的代码页就和中文不同,这样就可以

避免编码冲突导致计算机不知如何处理的问题。当然用这个也可以很容易的切换语言版本。
但是这都是治标不治本的方法,还是无法解决同时显示多种语言的问题,所以最后还是都用unicode吧,永远不会有冲

突了。
5.Unicode(Universal Code)
  这是一个编码方案,说白了就是一张包含全世界所有文字的一个编码表,不管你用的上,用不上,不管是现在用的,

还是以前用过的,只要这个世界上存在的文字符号,统统给你一个唯一的编码,这样就不可能有任何冲突了。不管你要

同时显示任何文字,都没有问题。
  因此在这样的方案下,Unicode出现了。Unicode编码范围是:0-0x10FFFF,可以容纳1114112个字符,100多万啊。全

世界的字符根本用不完了,Unicode 5.0版本中,才用了238605个码位。所以足够了。
因此从码位范围看,严格的unicode需要3个字节来存储。但是考虑到理解性和计算机处理的方便性,理论上还是用4个

字节来描述。
   Unicode采用的汉字相关编码用的是《CJK统一汉字编码字符集》— 国家标准 GB13000.1 是完全等同于国际标准《

通用多八位编码字符集 (UCS)》 ISO 10646.1。《GB13000.1》中最重要的也经常被采用的是其双字节形式的基本多文

种平面。在这65536个码位的空间中,定义了几乎所有国家或地区的语言文字和符号。其中从0x4E00到 0x9FA5 的连续

区域包含了 20902 个来自中国(包括台湾)、日本、韩国的汉字,称为 CJK (Chinese Japanese Korean) 汉字。CJK

是《GB2312-80》、《BIG5》等字符集的超集。
  CJK包含了中国,日本,韩国,越南,香港,也就是CJKVH。这个在UNICODE的Charset chart中可以明显看到。
  unicode的相关标准可以从unicode.org上面获得,目前已经进行到了6.0版本。

下面这段描述来自百度百科:
   Unicode字符集可以简写为UCS(Unicode Character Set)。早期的  unicodeUnicode标准有UCS-2、UCS-4的说法。

UCS-2用两个字节编码,UCS-4用4个字节编码。UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据

次高字节分为256个平面(plane)。每个平面根据第3个字节分为256行 (row),每行有256个码位(cell)。group 0

的平面0被称作BMP(Basic Multilingual Plane)。将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。   每个平

面有2^16=65536个码位。Unicode计划使用了17个平面,一共有17*65536=1114112个码位。在Unicode 5.0.0版本中,已

定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。其中平面15和平面16上只是定义

了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。所谓专用区

,就是保留给大家放自定义字符的区域,可以简写为PUA。   平面0也有一个专用区:0xE000-0xF8FF,有6400个码位

。平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。代理区的目的用两个UTF-

16字符表示BMP以外的字符。在介绍UTF-16编码时会介绍。   如前所述在Unicode 5.0.0版本中,238605-65534*2-

6400-2408=99089。余下的99089个已定义码位分布在平面0、平面1、平面2和平面14上,它们对应着Unicode目前定义的

99089个字符,其中包括71226个汉字。平面0、平面1、平面2和平面14上分别定义了52080、3419、43253和337个字符。

平面2的43253个字符都是汉字。平面0上定义了27973个汉字。
 

6.Unicode的实现方案
   Unicode其实只是一张巨大的编码表。要在计算机里面实现,也出现了几种不同的方案。也就是说如何表示unicode

编码的问题。
(1)UTF-8(UCS Transformation Format 8bit)
    这个方案的意思以8位为单位来标识文字,注意并不是说一个文字用8位标识。他其实是一种MBCS方案,可变字节的

。到底需要几个字节表示一个符号,这个要根据这个符号的unicode编码来决定,最多4个字节。
编码规则如下:
   Unicode编码(16进制) ║ UTF-8 字节流(二进制)  
 000000 - 00007F ║ 0xxxxxxx   
000080 - 0007FF ║ 110xxxxx 10xxxxxx   
000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx   
010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx   
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。

UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大

码位0x10FFFF也只有21位。   
例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx

10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110

10110001 10001001,即E6 B1 89。   
例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使用用4字节模板了:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。

将0x20C30写成21位二进制数字(不足21位就在前面补0):0 0010 0000 1100 0011 0000,用这个比特流依次代替模板

中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。

(2)UTF-16
 UTF-16编码以16位无符号整数为单位。注意是16位为一个单位,不表示一个字符就只有16位。现在机器上的unicode编

码一般指的就是UTF-16。绝大部分2个字节就够了,但是不能绝对的说所有字符都是2个字节。这个要看字符的unicode

编码处于什么范围而定,有可能是2个字节,也可能是4个字节。这点请注意!
下面算法解释来自百度百科。

我们把Unicode  unicode编码记作U。编码规则如下: 
  如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)。

  如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16

编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。为什么U'可以被写成20个二进制位?Unicode的最大码位

是0x10ffff,减去0x10000后,U'的最大值是0xfffff,所以肯定可以用20个二进制位表示。
    例如:Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000。用前10

位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD843

0xDC30。   
    按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,第一个WORD的高6位是110110,第二个

WORD的高6位是110111。可见,第一个WORD的取值范围(二进制)是11011000 00000000到11011011 11111111,即

0xD800-0xDBFF。第二个WORD的取值范围(二进制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。

  为了将一个WORD的UTF-16编码与两个WORD的UTF-16编码区分开来,Unicode编码的设计者将0xD800-0xDFFF保留下来

,并称为代理区(Surrogate):   
D800-DB7F ║ High Surrogates ║ 高位替代   
DB80-DBFF ║ High Private Use Surrogates ║ 高位专用替代   
DC00-DFFF ║ Low Surrogates ║ 低位替代   
   高位替代就是指这个范围的码位是两个WORD的UTF-16编码的第一个WORD。低位替代就是指这个范围的码位是两个

WORD的UTF-16编码的第二个WORD。那么,高位专用替代是什么意思?我们来解答这个问题,顺便看看怎么由UTF-16编码

推导Unicode编码。   
  如果一个字符的UTF-16编码的第一个WORD在0xDB80到0xDBFF之间,那么它的Unicode编码在什么范围内?我们知道第

二个WORD的取值范围是0xDC00-0xDFFF,所以这个字符的UTF-16编码范围应该是0xDB80 0xDC00到0xDBFF 0xDFFF。我们

将这个范围写成二进制:   1101101110000000 11011100 00000000 - 1101101111111111 1101111111111111   按

照编码的相反步骤,取出高低WORD的后10位,并拼在一起,得到   1110 0000 0000 0000 0000 - 1111 1111 1111

1111 1111  
即0xe0000-0xfffff,按照编码的相反步骤再加上0x10000,得到0xf0000-0x10ffff。这就是UTF-16编码的第一个WORD在

0xdb80到0xdbff之间的Unicode编码范围,即平面15和平面16。因为Unicode标准将平面15和平面16都作为专用区,所以

0xDB80到0xDBFF之间的保留码位被称作高位专用替代。

(3)UTF-32
 这个就简单了,和Unicode码表基本一一对应,固定四个字节。
 为什么不采用UTF-32呢,因为unicode定义的范围太大了,其实99%的人使用的字符编码不会超过2个字节,所以如同统

一用4个字节,简单倒是简单了,但是数据冗余确实太大了,不好,所以16位是最好的。就算遇到超过16位能表示的字

符,我们也可以通过上面讲到的代理技术,采用32位标识,这样的方案是最好的。所以现在绝大部分机器实现unicode

还是采用的utf-16的方案。当然也有UTF-8的方案。比如windows用的就是UTF16方案,不少linux用的就是utf8方案。

7. 编码存储差异

这里就要引出两个名词:
LE(little endian):小字节字节序,意思就是一个单元在计算机中的存放时按照低位在前(低地址),高位在后(高

地址)的模式存放。

BE(big endian):大字节字节序,和LE相反,是高位在前,低位在后。

比如一个unicode编码为:0x006C49,如果是LE,那么在文件中的存放顺序应该是:49 6c 00
如果是BE ,那么顺序应该是:00 6c 49

8.编码格式的检测

到底采用什么编码,如果能检测就好了。专家们也是这么想的,所以专家给每种格式和字节序规定了一些特殊的编码,

这些编码在unicode 中是没有使用的,所以不用担心会冲突。

这个叫做BOM(Byte Order Mark)头。意思是字节序标志头。通过它基本能确定编码格式和字节序。
UTF编码 ║ Byte Order Mark   
UTF-8   ║ EF BB BF   
UTF-16LE ║ FF FE   
UTF-16BE ║ FE FF   
UTF-32LE ║ FF FE 00 00   
UTF-32BE ║ 00 00 FE FF
所以通过检测文件前面的BOM头,基本能确定编码格式和字节序。
但是这个BOM头只是建议添加,不是强制的,所以不少软件和系统没有添加这个BOM头(所以有些软件格式中有带BOM头

和NoBOM头的选择),这个时候要检测什么格式,就比较麻烦了
当然可以检测,但是不能保证100%准确,只能通过编码范围从概率上来检查,虽然准确度还是比较高,但是不能保证

100%。所以,时常看到检测错误的软件,也不奇怪了。

总结:
   终于写完了,其实这些问题都是不统一导致的,属于历史问题,所以才会有这些困惑,这里也呼吁所有的软件 开发

人员自觉的采用Unicode标准进行文字处理,我相信在不久的将来,这些困扰都不会存在了,因为所有软件都是unicode

d ,只要有字库,任何文字都能同时显示,也可以到任何语言的平台上的去运行,不再有乱码的困惑!
  其实现在绝大部分软件已经是这么做的了!
   另外也不要被很多名词属于所迷惑,其实这些只是标准的问题,根本没有什么新的东西,更没有什么复杂的东西。

posted @ 2013-12-26 18:57 Jacc.Kim 阅读(484) | 评论 (0)编辑 收藏

说明:以下仅为个人的搭建过程记录摘要。按以下步骤搭建测试成功。参考链接有:
0. 引导
    http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c42246121b30a8e16071405f8f90613441e9120db4a72b24604573ecc589954fdbb0922d288f33712d5cd04e418f4fef961d73d620e106bff60ee7cbe74290b9a5d1c82253dd24756d8081c3045b44&p=c2769a4786cc42a858b1d22454078b&newp=927f861a85cc43ff57ee937e4e55a5231610db2151d4db15&user=baidu&fm=sc&query=Android+NDK+%B1%E0%D2%EB+zlib&qid=&p1=7

    http://www.ityran.com/archives/3223

1. cygwin环境搭建
    http://woniu1983.iteye.com/blog/1895724
    
    http://www.33lc.com/article/7276_4.html

2. android sdk 环境搭建
    http://hi.baidu.com/j_key/item/bdfe28f6b1758ad56325d259

3. jdk环境搭建.说明该点安装很简单。因此,没有提供相关参考链接。

4. android avd 环境搭建.(提示:该点为非本文相关功能介绍,可以不与理会。)
    http://shitou521.iteye.com/blog/1074593


cocos2d-x android 环境搭建步骤:
1. 下载ndk与cygwin安装包。(都分别从官网可以下得最新免费版本)

2. 安装cygwin。(可能需要挺长时间的)

3. 配置ndk路径。配置方法,可参考:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c42246121b30a8e16071405f8f90613441e9120db4a72b24604573ecc589954fdbb0922d288f33712d5cd04e418f4fef961d73d620e106bff60ee7cbe74290b9a5d1c82253dd24756d8081c3045b44&p=c2769a4786cc42a858b1d22454078b&newp=927f861a85cc43ff57ee937e4e55a5231610db2151d4db15&user=baidu&fm=sc&query=Android+NDK+%B1%E0%D2%EB+zlib&qid=&p1=7

4. 下载jdk包。(从官网下载,该包也是免费的)。下载完成后,直接安装。

5. 下载adt。可以从官网下载:adt-bundle。如:本人下载的:adt-bundle-windows-x86-20131030.zip。
该包也是免费的。该包中下载下来后,包含:eclips与android sdk两个包。
提示:如果下载的不是adt-bundle。则可能需要单独下载eclips与android sdk安装包。
下载完成后,解压到指定目录。安装android sdk。即:运行SDK Manager.exe即可。(提示:安装需要很长时间。。)

6. 以上完成后,再下载cocos2d-x相关的sdk包。找到create-android-project.bat。按照:http://www.ityran.com/archives/3223 上说明的方法,修改其中的:set _CYGBIN 、set _ANDROIDTOOLS以及set _NDKROOT相关路径。然后就可以有此bat创建自己的cocos2d-x java项目了。

7. 在处理完上面的第6点后。可以用cygwin编译项目。具体为:打开cygwin。然后转到新生成的项目下,执行: build_native.sh
编完成后会生成相应的.so。其实就是相当于win下的lib或称为dll吧。

8. 完成7后,再打开eclips,将工程添加进来。(记得也要添加cocos2d-x的工程。并优先编译它。因为我们的项目依赖于它)。编我们的项目,然后再将设备连上,Run As即可。至此,全部介绍结束。

-------------------------------------------------------------------------------

ndk下载后,直接解压即可。
cygwin安装(需要很长时间)后,需要配置ndk的路径
adt就是android sdk。
eclipse 正常来说,就已经集成了jdk了。
(ndk下载地址:官网)
(cygwin下载地址:官网)
(adt下载地址:官网)
(eclipse标准版下载地址:http://www.newasp.net/soft/69126.html)
(jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html)

 

posted @ 2013-12-26 10:20 Jacc.Kim 阅读(499) | 评论 (0)编辑 收藏

原谅转载自:http://woniu1983.iteye.com/blog/1895724

之前一直尝试配置Ubuntu下的环境的,我的Ubuntu12.04是VirtualBox虚拟机下的,整了半天,其他都好了,就是Eclipse下面安装ADT的时候,发现Eclipse连不上网络,查过代理等都没问题,于是本地安装ADT,结果又是和网络上的一样的一堆错误。 时间关系没有整到底,于是还是使用大家通行的Cygwin来吧。 

巴拉巴拉的介绍就不说了,直接记录步骤吧。 



1. Android NDK下载 
  下载Windows系统下的版本,至于32位还是64位由你机器而定,我的是Win7 32位,下载的是:android-ndk-r8e-windows-x86.zip 
  电梯直达:http://developer.android.com/tools/sdk/ndk/index.html#Installing 
  

2. Cygwin下载 
  下载Setup.exe 
  电梯直达:http://cygwin.com/install.html 

3. 安装 Android NDK 
   解压缩到某个目录即可,例如我的: E:\DevelopEnviroment\Android\ 
   解压缩后的文件夹名字如下:android-ndk-r8e 

4. 安装Cygwin 
   运行Setup.exe,如下图片是转载自别人的(请见参考Link) 












5. 运行下Cygwin 
   第一次运行后,会为你创建当前的用户包括一些环境文件(类似于Linux下的bash文件等等),下一步我们会修改其中的文件 

6. 配置NDK环境变量 
   .cygwin的安装目录,找到一个home\<你的用户名>\.bash_profile文件末尾添加如下: 
    其中“e/DevelopEnviroment/Android/android-ndk-r8e 
”是表示Android NDK是安装在E:/DevelopEnviroment/Android/android-ndk-r8e 
Shell代码  收藏代码
  1. ANDK=/cygdrive/e/DevelopEnviroment/Android/android-ndk-r8e  
  2. export ANDK  
      7. 测试NDK环境 
         输入 cd $ANDK, 进入/cygdrive/e/DevelopEnviroment/Android/android-ndk-r8e 

         进入/samples/hello-jni项目下,运行$ANDK/ndk-build 
         输出效果如下: 
      Output代码  收藏代码
      1. $ $ANDK/ndk-build  
      2. Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver  
      3. Gdbsetup       : libs/armeabi/gdb.setup  
      4. Install        : libhello-jni.so => libs/armeabi/libhello-jni.so  


         以上即表明安装完毕。 

        

      参考Link: http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c42246121b30a8e16071405f8f90613441e9120db4a72b24604573ecc589954fdbb0922d288f33712d5cd04e418f4fef961d73d620e106bff60ee7cbe74290b9a5d1c82253dd24756d8081c3045b44&p=c2769a4786cc42a858b1d22454078b&newp=927f861a85cc43ff57ee937e4e55a5231610db2151d4db15&user=baidu&fm=sc&query=Android+NDK+%B1%E0%D2%EB+zlib&qid=&p1=7

      http://wenku.baidu.com/view/63039e8071fe910ef12df86b.html
    posted @ 2013-12-23 16:10 Jacc.Kim 阅读(508) | 评论 (0)编辑 收藏

    posted @ 2013-12-17 20:18 Jacc.Kim 阅读(288) | 评论 (0)编辑 收藏

         摘要: 原谅转载自:http://www.cnblogs.com/skywang12345/p/3245399.html 红黑树(一) 原理和算法详细介绍        作者:Sky Wang    于 2013-08-08                 &n...  阅读全文
    posted @ 2013-12-08 16:54 Jacc.Kim 阅读(623) | 评论 (0)编辑 收藏

    一个包含逗号的表达式首先计算逗号左边的表达式,然后计算逗
    号右边的表达式;整个表达式的结果是逗号右边表达式的值。所以对于表达式:++i, --j;
    编译器首先计算++i,然后是--j,逗号表达式的结果是--j。
    posted @ 2013-11-25 21:00 Jacc.Kim 阅读(310) | 评论 (0)编辑 收藏

    1) 不论是 increment 或 decrement 的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++
    规定后缀形式有一个 int 类型参数,当函数被调用时,编译器传递一个 0 做为 int 参数的值
    给该函数(即:decrement函数)。示例如下:
    /******************************************************************************
    @-Author  : Jacc.Kim
    @-create  : [11-25-2013 20:33:55]
    @-summary : c++的increment与decrement学习
    @-modified: 
    *****************************************************************************
    */
    class UPInt
    {
    public:
        
    /**************************************************************************
        @-summary : ++ 前递增操作符重载
        @-in param: 
        @-return  : 
        @-!!!note : 1) 该函数返回的是当前对象自增后的引用。一定注意:是引用。
        @-          2) 该函数没有输入参数
        @-          3) 下面的 -- 前递减操作符重载类似
        *************************************************************************
    */
        UPInt 
    &operator++() {
            
    // 处理递增操作
            
    // 
            
    // some code here ..
            
    // 
            
    // 返回自身实例
            return *this;
        }

        
    /**************************************************************************
        @-summary : ++ 后递增操作符重载
        @-in param: 
        @-return  : 
        @-!!!note : 1) 该函数返回的是当前对象自增前的一个const副本。一定注意:是const副本。
        @-          2) 该函数接受一个int型参数,但实际上,该参数是没有任何作用的。
        @-          3) 下面的 -- 后递减操作符重载类似
        *************************************************************************
    */
        
    const UPInt operator++(int) {
            UPInt retObj 
    = *this;
            
    ++(*this);
            
    return retObj;
        }

        
    /**************************************************************************
        @-summary : -- 前递增操作符重载
        @-in param: 
        @-return  : 
        @-!!!note : 1) 该函数返回的是当前对象自减前的引用。一定注意:是引用。
        @-          2) 该函数没有输入参数
        *************************************************************************
    */
        UPInt 
    &operator--() {
            
    // 处理递减操作
            
    // 
            
    // some code here ..
            
    // 
            
    // 返回自身实例
            return *this;
        }

        
    /**************************************************************************
        @-summary : ++ 后递减操作符重载
        @-in param: 
        @-return  : 
        @-!!!note : 1) 该函数返回的是当前对象自减前的一个const副本。一定注意:是const副本。
        @-          2) 该函数接受一个int型参数,但实际上,该参数是没有任何作用的。
        *************************************************************************
    */
        
    const UPInt operator--(int) {
            UPInt retObj 
    = *this;
            
    --(*this);
            
    return retObj;
        }

    public:
        UPInt();
        
    virtual ~UPInt();

    };
    //class UPInt

    /******************************************************************************
    @-summary : 示例使用UPInt的 ++ 与 -- 的前、后操作符重载
    @-in param: 
    @-return  : 
    *****************************************************************************
    */
    void testUPIntIncAndDecOperator() {
        UPInt theObj;
        
    ++theObj; // 调用 theObj.operator++(); 
        theObj++// 调用 theObj.operator++(0);
        --theObj; // 调用 theObj.operator--(); 
        theObj--// 调用 theObj.operator--(0);
    }


    2) 为什么前缀与后缀的返回值会不同??
    答:一个后缀 increment 必须返回一个对象(它返回的是增加前的值),但是为什么
    是 const 对象呢?假设不是 const 对象,下面的代码就是正确的:
    UPInt i;
    i++++; // 两次 increment 后缀
    这组代码与下面的代码相同:
    i.operator++(0).operator++(0);
    很明显,第一个调用的 operator++函数返回的对象调用了第二个 operator++函数。
    有两个理由导致我们应该厌恶上述这种做法,第一是与内置类型行为不一致。当设计一
    个类遇到问题时,一个好的准则是使该类的行为与 int 类型一致。而 int 类型不允许连续进
    行两次后缀 increment:
    int i;
    i++++; // 错误!
    第二个原因是使用两次后缀 increment 所产生的结果与调用者期望的不一致。如上所
    示,第二次调用 operator++改变的值是第一次调用返回对象的值,而不是原始对象的值。
    因此如果:
    i++++;
    是合法的,i 将仅仅增加了一次。这与人的直觉相违背,使人迷惑(对于 int 类型和 UPInt
    都是一样),所以最好禁止这么做。

    3) 同样条件下,前缀比后缀操作符来的高效。
    posted @ 2013-11-25 20:50 Jacc.Kim 阅读(683) | 评论 (0)编辑 收藏

    仅列出标题
    共14页: 1 2 3 4 5 6 7 8 9 Last