非 BMP 字符判断及判断字符串中是否包含非 BMP 字符

判断一个字符是 BMP 字符还是非 BMP 字符(增补字符), 以及判断字符串中是否包含非 BMP 字符.

在 Java 中, 要判断一个字符是否为增补字符, 也即所谓的非 BMP 字符, 可以综合使用 String 类中的 codePointAtCharacter 类中的 isSupplementaryCodePoint 方法, 具体如下:

@Test
public void testSupplementaryCodePoint() throws Exception {
	// 一个非 BMP 字符
	String s = "𧿹";
	// 长度为 2
	assertThat(s.length()).isEqualTo(2);
	// 属于增补字符
	assertThat(Character.isSupplementaryCodePoint(s.codePointAt(0))).isTrue();
}

当然也可以简单地尝试将这个字符赋值给一个 char 变量, char 变量只能接受一个 BMP 字符, 如果是非 BMP 字符, 则编译不通过. 如果是一串的字符, 想知道其中是否存在非 BMP 字符, 则可以使用 codePointCount 方法:

@Test
public void testCodePointCount() throws Exception {
	String normalStr = "hi你";
	String strContainNoneBMP = "h𧿹你";
	
	// 两者的 length 不同
	assertThat(normalStr.length()).isEqualTo(3);
	assertThat(strContainNoneBMP.length()).isEqualTo(4);
	
	// 两者的码点数( code point count)却是相同的
	assertThat(normalStr.codePointCount(0, normalStr.length())).isEqualTo(3);
	assertThat(strContainNoneBMP.codePointCount(0, strContainNoneBMP.length())).isEqualTo(3);
}

继续阅读

关于代码行数——IT 名言录

靠代码行数来衡量开发进度就好比用重量来衡量飞机制造的进度。——比尔·盖茨

Measuring programming progress by lines of code is like measuring aircraft building progress by weight.——Bill Gates

之前也曾写了一个类似的演示,因为一开始弄 impress.js,一些特性还不熟悉,做得相对较差了些,现在依旧可以访问:

CSS 绘制三角形原理演示(动画)(旧版)(不推荐)

现在重新做了些修改,V2 版本参见:

CSS 绘制三角形原理演示(动画)V2 版

主要的一些改进如下:

  • 增加了子步骤,一页中内容过多时可以逐步呈现。
  • 增加了代码的高亮。(使用了 prism.js)
  • 增强的 impress.js,增加了导航按钮,下拉选择列表,进度条以及自动播放等特性。
  • 重新规划了页面的整体布局,在结尾增加了预览页。
  • 增加了部分动画演示,调整了部分语句及顺序等。
  • 支持在手机端阅读(不过导航效果等还不太好,仍不推荐在手机端阅读)。

如果你有什么改进意见,欢迎留言!

keynote 是个什么鬼? 关于苹果用户和普通用户的区别

有一次我看到别人说: "我的 keynote 还没有弄好", 恕我孤陋寡闻, 我当时并不知道 keynote 到底是个什么鬼...

普通用户: 我的电脑坏了! 苹果用户: 我的 Mac 坏了!

普通用户: 我的平板上不了网! 苹果用户: 我的 iPad 上不了网!

普通用户: 我的手机没电了! 苹果用户: 我的 iPhone 没电了!

普通用户: 今天演讲的幻灯片已经准备好了! 苹果用户: 今天演讲的 keynote 已经准备好了!

当然了, 以上说得可能有点绝对了.

普通用户会这样反驳:

我们这些用户才不是你说的这样的啦!

苹果用户会这样反驳:

我们苹果用户才不是你说的这样的啦!

说实话, 我有时觉得像 qq 或微博上显示的那种 "来自xxx" 之类的小尾巴真是没有必要, 因为很多时候你只要往上翻翻这个用户的发言记录, 就不难发现他到底是什么用户.

**人月(Man-Month)**是一种衡量工作量的单位。

举例来说,如果一个项目需要 24 个人月,如果投入 3 个人,那么需要 8 个月才能做完:

24 人月 = 3 人 × 8 月

如果投入 4 个人,那么只要半年,也即是 6 个月即可做完:

24 人月 = 4 人 × 6 月

以上计算假设了人月是可以互换的,投入越多的人,事情就能越快的完成。

不过实际上事情往往没有这么简单,软件工程方面有一本著名的书,叫《人月神话》(The Mythical Man-Month),就否定了这种互换的神话。

对于软件开发这种复杂的智力活动,你很难通过简单增加人手就能加快进度。

一个不太恰当的隐喻即是,如果生一个孩子是 10 人月的活,并不是说你投入 10 个女人就能在一个月内搞掂这件事情!