当前位置: 编程技术>移动开发
本页文章导读:
▪解决NSData中非法utf-8字节的有关问题 解决NSData中非法utf-8字节的问题
当用nsdata,按照utf8编码来初始化nsstring时,如果nsdata出现了非法utf-8编码,nsstring就回返回空,这不是我所期望的,对于非法的字节,可以用A代替。 .........
▪ jdk 跟 jre 的区别 jdk 和 jre 的区别
1 jre java runtime environment java程序运行环境 包含jvm和核心类 虚拟机是(bin/client中的jvm.dll)jdk java development kit java程序开发包 他提供一系列的编译和运行工具 javac java 等命令/jre.........
▪ Singleton 单例模式(懒汉模式和饿汉方式) Singleton 单例模式(懒汉方式和饿汉方式)
单例模式的概念:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个.........
[1]解决NSData中非法utf-8字节的有关问题
来源: 互联网 发布时间: 2014-02-18
解决NSData中非法utf-8字节的问题
当用nsdata,按照utf8编码来初始化nsstring时,如果nsdata出现了非法utf-8编码,nsstring就回返回空,这不是我所期望的,对于非法的字节,可以用A代替。
按照utf8格式标准,
U+00000000 - U+0000007F: 0 xxxxxxx 0x - 7x
U+00000080 - U+000007FF: 110 xxxxx 10 xxxxxx Cx 8x - Dx Bx
U+00000800 - U+0000FFFF: 1110 xxxx 10 xxxxxx 10 xxxxxx Ex 8x 8x - Ex Bx Bx
U+00010000 - U+001FFFFF: 11110 xxx 10 xxxxxx 10 xxxxxx 10 xxxxxx F0 8x 8x 8x - F7 Bx Bx Bx 很少用
U+00200000 - U+03FFFFFF: 111110 xx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx F8 8x 8x 8x 8x - FB Bx Bx Bx Bx
U+04000000 - U+7FFFFFFF: 1111110 x 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx FC 8x 8x 8x 8x 8x - FD Bx Bx Bx Bx Bx
如果一个字节小于0x80,那么他就是一个字符,如果大于C0小于E0,表示有2个字节是utf8,第一个是110开头的,第二个是10开头的,如果大于E0小于F0,表示3个字节是utf8,第一个是1110开头的,第二个是10开头的,第三个是10开头的,如果不是表明非法,将非法的字节设置为A,即可。
如何判断一个字节是否是110开头的或者是1110开头的呢?用b & 0xE0 == 0xC0,类推,判断是否是1110开头的,b&0xF0 == 0xE0。
经过这一的转化,nsstring就能初始化了。
代码如下:
当用nsdata,按照utf8编码来初始化nsstring时,如果nsdata出现了非法utf-8编码,nsstring就回返回空,这不是我所期望的,对于非法的字节,可以用A代替。
按照utf8格式标准,
U+00000000 - U+0000007F: 0 xxxxxxx 0x - 7x
U+00000080 - U+000007FF: 110 xxxxx 10 xxxxxx Cx 8x - Dx Bx
U+00000800 - U+0000FFFF: 1110 xxxx 10 xxxxxx 10 xxxxxx Ex 8x 8x - Ex Bx Bx
U+00010000 - U+001FFFFF: 11110 xxx 10 xxxxxx 10 xxxxxx 10 xxxxxx F0 8x 8x 8x - F7 Bx Bx Bx 很少用
U+00200000 - U+03FFFFFF: 111110 xx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx F8 8x 8x 8x 8x - FB Bx Bx Bx Bx
U+04000000 - U+7FFFFFFF: 1111110 x 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx FC 8x 8x 8x 8x 8x - FD Bx Bx Bx Bx Bx
如果一个字节小于0x80,那么他就是一个字符,如果大于C0小于E0,表示有2个字节是utf8,第一个是110开头的,第二个是10开头的,如果大于E0小于F0,表示3个字节是utf8,第一个是1110开头的,第二个是10开头的,第三个是10开头的,如果不是表明非法,将非法的字节设置为A,即可。
如何判断一个字节是否是110开头的或者是1110开头的呢?用b & 0xE0 == 0xC0,类推,判断是否是1110开头的,b&0xF0 == 0xE0。
经过这一的转化,nsstring就能初始化了。
代码如下:
//将nsdata中的非法字符替换为A 0x41 char aa[] = {'A','A','A','A','A','A'}; NSMutableData *md = [NSMutableData dataWithData:data]; int loc = 0; while(loc < [md length]){ char buffer; [md getBytes:&buffer range:NSMakeRange(loc, 1)]; //printf("%d", buffer&0x80); if((buffer & 0x80) == 0){ loc++; continue; }else if((buffer & 0xE0) == 0xC0){ loc++; [md getBytes:&buffer range:NSMakeRange(loc, 1)]; if((buffer & 0xC0) == 0x80){ loc++; continue; } loc--; //非法字符,将这1个字符替换为AA [md replaceBytesInRange:NSMakeRange(loc , 1) withBytes:aa length:1]; loc++; continue; }else if((buffer & 0xF0) == 0xE0){ loc++; [md getBytes:&buffer range:NSMakeRange(loc, 1)]; if((buffer & 0xC0) == 0x80){ loc++; [md getBytes:&buffer range:NSMakeRange(loc, 1)]; if((buffer & 0xC0) == 0x80){ loc++; continue; } loc--; } loc--; //非法字符,将这个字符替换为A [md replaceBytesInRange:NSMakeRange(loc , 1) withBytes:aa length:1]; loc++; continue; }else{ [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1]; loc++; continue; } } //NSLog(@" new data =>%@", md); str = [[[NSString alloc] initWithData:md encoding:NSUTF8StringEncoding] autorelease];
[2] jdk 跟 jre 的区别
来源: 互联网 发布时间: 2014-02-18
jdk 和 jre 的区别
1 jre java runtime environment java程序运行环境 包含jvm和核心类 虚拟机是(bin/client中的jvm.dll)
jdk java development kit java程序开发包 他提供一系列的编译和运行工具 javac java 等命令
/jre/bin/server /jre/bin/client 各自有一个 jvm.dll所以它包含两个虚拟机
2 配置环境变量:JAVA_HOME C:\Program Files (x86)\Java\jdk1.6.0_04 jdk的路径
Path %JAVA_HOME%\bin;
javac Test.java
java Test
3 下面这个可以配置也可以不配置
classpath 是指定java程序运行或编译类时候的搜索类的路径 先搜索核心类 再搜索classpath
.;c:\jar\log4j.jar;d:\work\java
指定了3个搜索类路径 . 是当前路径(这个很重要)
1 jre java runtime environment java程序运行环境 包含jvm和核心类 虚拟机是(bin/client中的jvm.dll)
jdk java development kit java程序开发包 他提供一系列的编译和运行工具 javac java 等命令
/jre/bin/server /jre/bin/client 各自有一个 jvm.dll所以它包含两个虚拟机
2 配置环境变量:JAVA_HOME C:\Program Files (x86)\Java\jdk1.6.0_04 jdk的路径
Path %JAVA_HOME%\bin;
javac Test.java
java Test
3 下面这个可以配置也可以不配置
classpath 是指定java程序运行或编译类时候的搜索类的路径 先搜索核心类 再搜索classpath
.;c:\jar\log4j.jar;d:\work\java
指定了3个搜索类路径 . 是当前路径(这个很重要)
[3] Singleton 单例模式(懒汉模式和饿汉方式)
来源: 互联网 发布时间: 2014-02-18
Singleton 单例模式(懒汉方式和饿汉方式)
单例模式的概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
关键点:
1)一个类只有一个实例 这是最基本的
2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例
----------------------------------------------------------------------------
两种实现方式:
1 懒汉模式(类加载时不初始化)
复制代码
package Singleton;
public class LazySingleton {
//懒汉式单例模式
//比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢
private static LazySingleton intance = null;//静态私用成员,没有初始化
private LazySingleton()
{
//私有构造函数
}
public static synchronized LazySingleton getInstance() //静态,同步,公开访问点
{
if(intance == null)
{
intance = new LazySingleton();
}
return intance;
}
}
复制代码
关键点:(代码注释上已给出)
1)构造函数定义为私有----不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象
2)成员变量为static的,没有初始化----类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象
3)公开访问点getInstance: public和synchronized的-----public保证对外公开,同步保证多线程时的正确性(因为类变量不是在加载时初始化的)
优缺点见代码注释。
2 饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)
复制代码
package Singleton;
public class EagerSingleton {
//饿汉单例模式
//在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
private static EagerSingleton instance = new EagerSingleton();//静态私有成员,已初始化
private EagerSingleton()
{
//私有构造函数
}
public static EagerSingleton getInstance() //静态,不用同步(类加载时已初始化,不会有多线程的问题)
{
return instance;
}
}
复制代码
关键点:(代码注释已写)
1)私有构造函数
2)静态私有成员--在类加载时已初始化
3)公开访问点getInstance-----不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回
优缺点见代码注释。
单例模式的概念:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
关键点:
1)一个类只有一个实例 这是最基本的
2)它必须自行创建这个实例
3)它必须自行向整个系统提供这个实例
----------------------------------------------------------------------------
两种实现方式:
1 懒汉模式(类加载时不初始化)
复制代码
package Singleton;
public class LazySingleton {
//懒汉式单例模式
//比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢
private static LazySingleton intance = null;//静态私用成员,没有初始化
private LazySingleton()
{
//私有构造函数
}
public static synchronized LazySingleton getInstance() //静态,同步,公开访问点
{
if(intance == null)
{
intance = new LazySingleton();
}
return intance;
}
}
复制代码
关键点:(代码注释上已给出)
1)构造函数定义为私有----不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象
2)成员变量为static的,没有初始化----类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象
3)公开访问点getInstance: public和synchronized的-----public保证对外公开,同步保证多线程时的正确性(因为类变量不是在加载时初始化的)
优缺点见代码注释。
2 饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)
复制代码
package Singleton;
public class EagerSingleton {
//饿汉单例模式
//在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
private static EagerSingleton instance = new EagerSingleton();//静态私有成员,已初始化
private EagerSingleton()
{
//私有构造函数
}
public static EagerSingleton getInstance() //静态,不用同步(类加载时已初始化,不会有多线程的问题)
{
return instance;
}
}
复制代码
关键点:(代码注释已写)
1)私有构造函数
2)静态私有成员--在类加载时已初始化
3)公开访问点getInstance-----不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回
优缺点见代码注释。
最新技术文章: