เล่นกับ UCFindTextbreak

ผมลองเขียน code แบบข้างล่างดู x เป็น UTF-8 string เขียนแบบเถื่อนๆ หน่อย. จริงๆแล้วคือ string นี้ “สูงอันดับสองของมหาเถรสมาคม”.

void
play_uc_find_textbreak()
{
	UniChar x[] = { 0xE2A,  0xE39,  0xE07,  0xE2D,  0xE31,  0xE19,  0xE14,  0xE31,  0xE1A,  0xE2A,
  0xE2D,  0xE07,  0xE02,  0xE2D,  0xE07,  0xE21,  0xE2B,  0xE32,  0xE40,  0xE16,
  0xE23,  0xE2A,  0xE21,  0xE32,  0xE04,  0xE21};
	int len = sizeof(x)/sizeof(x[0]);
	TextBreakLocatorRef breakLocator;
	int position = 0;
	OSStatus s;

	printf("position = %d len = %d\n", position, len);
	s = UCCreateTextBreakLocator(NULL, 0, kUCTextBreakWordMask, &breakLocator);
	if(noErr == s)
	{
		int i;
		UniCharArrayOffset end_offset;
		for(i = 0; i < len;)
		{
			s = UCFindTextBreak(breakLocator,
								kUCTextBreakWordMask,
								i == 0 ? kUCTextBreakLeadingEdgeMask : 0,
								(const UniChar *)x,
								len,
								i,
								&end_offset);
			printf("### s=%s i=%d end=%d\n", s==noErr ? "cool" : "sad" , i, end_offset);
			i = end_offset;
		}
	}
}

ทุกอย่างก็ดู ok แต่ว่ามัน run ไม่จบซักที

position = 0 len = 26
### s=cool i=0 end=3
### s=cool i=3 end=3
### s=cool i=3 end=3
### s=cool i=3 end=3
### s=cool i=3 end=3


ใส่ position เท่ากับ 3 เข้าไป offset ที่ได้คืนออกมาก็เท่ากับ 3 เหมือนกัน. คล้ายกับว่า UCFindTextbreak อาจจะไม่ได้ออกแบบไว้ทำ layout. แต่ว่าออกแบบไว้เวลาเอา mouse ไป click บน text แล้วสามารถ high-light คำที่ถูก click ได้อย่างถูกต้อง. ถ้าจิตนาการแบบนี้ การที่ UCFindTextBreak คืนค่าเดียวกับ position ก็อาจจะสมเหตุสมผล?

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s