`
leonzhx
  • 浏览: 793610 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

读 Character 原代码

阅读更多

今天粗略读了一下Character的代码,总结如下:

 

1. 定义了一些 UnicodeSubset (UnicodeBlock) , 每一个UnicodeBlock 代表一个代码段(范围),一部分代码段表示一个UnicodeScript, 任何一个CodePoint都属于某一个UnicodeScript,但不一定属于某一个UnicodeBlock(因为有些代码段不属于任何subset or block--block的name 为null ,这种情况下UnicodeScript就是"UNASSIGNED")

 

2. 不是很理解为什么  public static UnicodeScript of(int codePoint) 用了  Arrays.binarySearch 而 public static UnicodeBlock of(int codePoint) 却是自己写的二分算法。

 

   UnicodeScript的算法:

 int index = Arrays.binarySearch(scriptStarts, codePoint);
            if (index < 0)
                index = -index - 2;
            return scripts[index];

 

  UnicodeBlock的算法:

  int top, bottom, current;
            bottom = 0;
            top = blockStarts.length;
            current = top/2;

            // invariant: top > current >= bottom && codePoint >= unicodeBlockStarts[bottom]
            while (top - bottom > 1) {
                if (codePoint >= blockStarts[current]) {
                    bottom = current;
                } else {
                    top = current;
                }
                current = (top + bottom) / 2;
            }
            return blocks[current];
 

3. 为 0-127 (BASIC_LATIN , LATIN_1_SUPPLEMENT, LATIN_EXTENDED_A) 的Code Point建了cache pool, 这个范围的Character new出来都是单例。

 

4. isValidCodePoint 用了一个简易的小tricky 优化了一下:

 // Optimized form of:
        //     codePoint >= MIN_CODE_POINT && codePoint <= MAX_CODE_POINT
        int plane = codePoint >>> 16;
        return plane < ((MAX_CODE_POINT + 1) >>> 16);

 

5.  public static int charCount(int codePoint)  没有validate codePoint, 如果codePoint为负数时,也返回1就不太对了。

 

6.  isJavaIdentifierStart 和 isJavaIdentifierPart 可以用来判断一个字符可不可以用来作为Java标识符的开头和部分。

 

7.  字母 A-Z 可以用来表示基数为10 以上的进制中的一位digit。forDigit方法用来获得某个进制中某字母代表的digit,而digit方法可以得到某个进制中某个digit用哪个字母表示。

 

8.  unicode 为字符定义了一个数值,比如‘A’是10 , ‘Ⅸ’  是9, 可以用 getNumericValue方法得到一个Code Point的该值。

 

9.  isWiteSpace方法用来判断某个Code Point是不是Java认为的空白字符。

 

10.  isMirrored用来判断字符是否具有镜面对称的字符。比如'(' , '['.

 

11.  提供了一个 非public 的static char[] toUpperCaseCharArray(int codePoint) 是因为unicode 规定在 BMP中的unicode可能出现其大写是双字符的情况。比如 ß 的大写是 SS。这个方法会被String使用,所以只有String的toUpperCase会将ß 变成SS,而Character不行。

 

12. getName用来得到Code Point的名称,比如Character.getName(' ') 就是 SPACE, 对于没有名称的character就用它的UnicodeBlock名(下划线用空格替换)加上Code Point代码。比如 Character.getName('\uD801') 就是 HIGH SURROGATES D801。如果没有UnicodeBlock,就返回null。

 

13.  最后写了一点Test Case :

@Test
	public void testCharacter() {

		
        
		assertFalse(Character.isLetter('9'));
		
		assertFalse(Character.isAlphabetic('\t'));
		
		assertTrue(Character.isAlphabetic('Ⅸ'));
		
		assertFalse(Character.isJavaIdentifierStart('2'));
		
		assertFalse(Character.isJavaIdentifierPart(' '));
		
		assertFalse(Character.isUpperCase(Character.toUpperCase(0)));
		
        assertEquals(15, Character.getNumericValue('F'));
        
        assertEquals(9 , Character.getNumericValue('Ⅸ'));
        
        assertEquals(-1 , Character.digit('E' , 14));
        
        assertEquals(14, Character.digit('E' , 16));
        
        //maximal radix is 36 , because we only have 26 alphabet
        assertEquals( 0 , Character.forDigit(11, 37));
        
        assertEquals('b' , Character.forDigit(11, 35));
        
        assertFalse(Character.isMirrored(','));
        
        assertTrue(Character.isMirrored('('));
        
        assertEquals('\u00df', Character.toUpperCase('\u00df'));
        
        assertEquals( "SS" ,"\u00df".toUpperCase());
        
        assertEquals("SPACE", Character.getName(' '));
        
        assertEquals("HIGH SURROGATES D801", Character.getName('\uD801'));
        
        assertNull(Character.getName(0x102E0));
	}
 

 

 

分享到:
评论

相关推荐

    数字识别系统代码--源代码

    接下来,可能运用如OCR(Optical Character Recognition,光学字符识别)算法来识别这些特征,并将其转化为可读的数字文本。此外,也可能采用了深度学习方法,如卷积神经网络(CNN)来训练模型以提高识别准确率。 ...

    智能车牌识别源代码.rar

    7. **OCR(Optical Character Recognition)技术**:OCR技术用于将识别出的车牌区域转换为可读的文本。CNN模型在车牌字符识别中表现出色,可以对每个字符进行单独识别,然后组合成完整的车牌号码。 8. **数据集与...

    车牌识别源代码

    4. 字符识别:利用OCR(Optical Character Recognition)技术,将字符图像转化为可读文本。 二、车牌识别源代码结构 该源代码应包含以下几个关键模块: 1. 图像处理模块:实现预处理算法,如Canny边缘检测、Otsu二...

    车牌号实验源代码(注释修正版).rar

    在本资源中,我们主要关注的是一个用于车牌号识别的数字图像处理实验的源代码,该代码是基于MATLAB编写的,并且经过了注释修正,使得理解和学习过程更为便捷。MATLAB是一种强大的数学计算软件,它在图像处理、数据...

    可以直接使用的百度文字识别源代码(车牌识别)

    “文字识别”(OCR,Optical Character Recognition)是核心技术,指将图像中的文字转换成机器可读的文本;“OCR”是实现文字识别的技术手段,通常涉及到图像处理和深度学习算法;“车牌识别”则是应用领域,意味着...

    delphi 识别车牌 源代码

    对于"delphi 识别车牌 源代码"的主题,我们可以深入探讨以下几个关键知识点: 1. 图像处理与计算机视觉: 车牌识别系统通常基于计算机视觉技术,涉及到图像预处理、特征提取、模板匹配或机器学习算法。在Delphi中...

    用c#实现的microsoft agent动画精灵源代码

    例如,以下是一个简单的C#代码片段,展示了如何加载角色并让它说话: ```csharp using Microsoft.Agent; using Microsoft.Win32; // 加载角色 Agent agent = new Agent(); agent.Character = "Robbie"; agent....

    VB编程源代码 93鼠标取词.rar

    《VB编程源代码:93鼠标取词》 在信息技术高速发展的今天,编程语言成为连接人与计算机的重要桥梁。Visual Basic(简称VB)是微软公司推出的一种面向对象的、可视化编程工具,它以其简单易学、高效灵活的特点,深受...

    智能停车场车牌识别计费系统Python源代码+可执行文件+使用说明

    这个系统包含的源代码、可执行文件以及使用说明,为用户提供了从源码级别理解到实际应用的全方位体验。 首先,Python作为该系统的开发语言,具有简洁易读的语法,丰富的库支持和跨平台运行的能力,使得开发这样的...

    Easy Character Movement 1.8.1.unitypackage

    Easy Character Movement是一种功能强大的高性能,但基于Rigidbody的角色控制器却易于使用。 它可以用于任何类型的...•完整注释了C#源代码。清晰,易读且易于修改。 •移动友好。 •垃圾收集器友好。 • 和更多!

    LCD-Character-master_stm32lcd_

    标题中的“LCD-Character-master_stm32lcd_”表明这是一个关于在STM32微控制器上实现LCD字符显示的项目。...通过研究项目源代码,我们可以学习到如何在实际项目中应用这些技术,从而提升STM32与LCD集成的能力。

    彭国伦《fortran95程序设计》源程序.rar

    Fortran95是其在1995年的版本,相较于早期的Fortran77,它引入了许多现代编程特性,使得代码更加清晰、易读和可维护。彭国伦的《Fortran95程序设计》一书,应该是针对初学者和有一定经验的程序员,提供了深入学习...

    小程序源码 OcrSearch.part1.zip

    【小程序源码 OcrSearch.part1.zip】是一个包含小程序源代码的压缩文件,名字为"OcrSearch.part1",可能是一个分卷压缩文件的一部分。根据名称推测,这个小程序的核心功能可能涉及到OCR(Optical Character ...

    车号识别 java版

    5. 字符识别:使用OCR(Optical Character Recognition)技术,将字符转换为可读文本。 6. 后处理:校正识别错误,提高整体识别率。 在Java环境下开发ANPR系统,可能会用到OpenCV库进行图像处理,Tesseract OCR进行...

    LCD1602 - 2 line x 16 character LCD display.zip

    1. `lcd1602.c`:这是一个C语言编写的源代码文件,包含了LCD1602的驱动程序实现。它包含了初始化、控制字符显示、移动光标等功能的函数。 2. `main.c`:这是主程序文件,可能包含一个示例应用,展示了如何使用`lcd...

    AndroidProjects:该项目包含HP IDOL OnDemand中博客的OCR Document API演示的Android源代码。-android source code

    **AndroidProjects 源代码分析** 本项目是一个基于Android平台的应用程序,主要目的是演示如何使用HP IDOL OnDemand服务中的OCR (Optical Character Recognition) 文档API。通过这个项目,开发者可以了解如何在...

    22课 逆战自动开枪初始脚本_逆战自动开枪源码_逆战_

    1. OCR(Optical Character Recognition):在某些情况下,脚本可能需要识别游戏内的文本信息,例如敌人的血量,OCR技术可以帮助将图像转换为可读的文本数据。 2. 像素比对:通过比较屏幕上的像素与预设模板的...

    delphi车牌识别程序源码..rar

    4. **OCR(Optical Character Recognition)技术**:OCR是将图像中的文本转换为机器可读格式的技术。在这个项目中,OCR可能被用于识别出车牌图片中的每个字符,并将其转换为文本字符串。 5. **文件I/O操作**:源...

    夏普名片扫描

    这款软件的源代码提供了深入学习和理解名片识别技术的机会,对于开发者来说是宝贵的教育资源。 1. 名片扫描:扫描功能是该应用的核心,它通过手机摄像头捕获名片的图像,然后进行高质量的图像处理,包括去噪、裁剪...

    C 数字识别技术代码.rar

    - OCR(Optical Character Recognition,光学字符识别)是将图像中的字符转换为机器可读文本的技术。在这个项目中,神经网络可能被训练成一个OCR系统,对每个数字或字符进行分类。 - OCR通常包括图像预处理、特征...

Global site tag (gtag.js) - Google Analytics