明日的記憶(明日の記憶)


如果過了明天 我連你都忘記了 也請你緊握我的手 陪我繼續走下去…

佐伯雅行(渡邊謙)是知名廣告公司主管,工作賣力認真,不但受老闆肯定,也備受下屬愛戴。他能無憂地在職場打拼,是虧得溫柔體貼的妻子枝實子始終默默支持,兩人甜蜜的感情羨煞許多人。而女兒梨惠也即將出嫁,還有個未出世的小外孫,幸福似乎始終圍繞在他身旁。直到某日,他因為不堪長期頭痛暈眩的困擾而就醫,這才驚覺原來自己的健康早在不知不覺中流逝。

 他開始想不起來每天一起工作的同事長什麼樣子,
 每天上班都要經過的街道,卻變成了陌生的風景,
 上一秒鐘才訂好開會的時間,下一秒卻完全忘記……

 直到有一天,佐伯不知不覺來到當年與枝實子相識的地方,他想起年輕時候彼此承諾相愛一生,想起了那時她說「我願意」的溫柔語調,卻怎麼也想不起她的模樣。枝實子回家找不到佐伯的蹤影,無助之餘,便也來到這個回憶之所。看到佐伯從前方走過來,她好想上前給丈夫一個擁抱,只是佐伯看著眼前這位眼中盈滿淚水的女子,覺得既熟悉又陌生……

會看這部電影, 除了Ellen強力想看之外, 我也想衝著渡邊謙(Watanabe Ken)去看看.

我對渡邊謙的認識, 從末代武士(The Last Samurai), 到藝妓回憶錄(Memoirs of a Geisha), 一直到最近看的來自硫磺島的信(硫黄島からの手紙), 他給我的印象就是鐵一般的男子, 標準的日本硬漢, 很傳神的把這樣的角色作最好的詮釋. 但這部片中的病人形象與示弱演出, 讓我看到他在詮釋角色上的功力.

當然渡邊謙的好表現是意料之中的, 而演女主角的樋口可楠子(Kanako Higuchi)卻也讓我記憶深刻. 相對之下, 我認為樋口可楠子在角色詮釋上並不比渡邊謙遜色, 相反的甚至有凌駕之勢.

對於阿茲海默症我並沒有太多的了解, 但是卻能體會逐漸失智時, 身邊親人的痛苦與不捨, 更何況是發生在中壯年的早發性阿茲海默症, 更是對親人有著無比的折磨. 而除了在兩位男女主角的深情演出之外, 導演巧妙運用日式電影最擅用的代表物: 男主角製作的陶瓷杯子. 將整部電影從頭貫穿到尾. 也帶著觀眾從一位中年好男人逐漸失去記憶的過程中, 慢慢去感受原著荻原浩與導演堤幸彥想要表達的深沈情感, 和那種「疾病固然會侵蝕一個人的一切,但是深厚的情感卻能彌補傷痛。」的感動.

劇情上也是秉持一貫日式電影的清淡雋永, 沒有太多撒狗血的橋段卻會讓人在淡淡的劇情中深深的沉入那種堅強的悲傷之中; 而運鏡上大量運用旋轉全景來詮釋那種迷失慌亂的感覺, 雖然真切卻叫人感覺太虛幻, 有些使用過度了; 而配樂上則是僅能算是中規中矩, 沒有很特殊很醒目的表現. 運鏡與配樂是我覺得有些些美中不足的遺憾.

不過除此之外, 那種夫妻之情父女之愛倒是非常完整的呈現, 不但能夠感動那些家有失智患者的家屬, 也能感動所有踏進電影院欣賞的觀眾.

在這一檔華麗大片縱橫的暑假檔期, 這倒是一部非常值得與另一半一同欣賞的好戲.

Convert UTF-8 Character to Codepoint

Pear看到的Codes, 因為用的到, 所以紀錄一下.


function utf8ToCodepoint( $char ) {
$z = ord( $char{0} );
if ( $z & 0x80 ) {
$length = 0;
while ( $z & 0x80 ) {
$length++;
$z <<= 1; } } else { $length = 1; } if ( $length != strlen( $char ) ) { return false; } if ( $length == 1 ) { return ord( $char ); } $z &= 0xff; $z >>= $length;
for ( $i=1; $i<$length; $i++ ) { $z <<= 6; $z |= ord( $char{$i} ) & 0x3f; } return $z; }

另外一個是在這裡看到的, 他的功能多一些, 是可以一次轉一整個String到一個Codepoint Array中


function utf8ToUnicode(&$str)
{
$mState = 0; // cached expected number of octets after the current octet
// until the beginning of the next UTF8 character sequence
$mUcs4 = 0; // cached Unicode character
$mBytes = 1; // cached expected number of octets in the current sequence

$out = array();

$len = strlen($str);
for($i = 0; $i < $len; $i++) { $in = ord($str{$i}); if (0 == $mState) { // When mState is zero we expect either a US-ASCII character or a // multi-octet sequence. if (0 == (0x80 & ($in))) { // US-ASCII, pass straight through. $out[] = $in; $mBytes = 1; } else if (0xC0 == (0xE0 & ($in))) { // First octet of 2 octet sequence $mUcs4 = ($in); $mUcs4 = ($mUcs4 & 0x1F) << 6; $mState = 1; $mBytes = 2; } else if (0xE0 == (0xF0 & ($in))) { // First octet of 3 octet sequence $mUcs4 = ($in); $mUcs4 = ($mUcs4 & 0x0F) << 12; $mState = 2; $mBytes = 3; } else if (0xF0 == (0xF8 & ($in))) { // First octet of 4 octet sequence $mUcs4 = ($in); $mUcs4 = ($mUcs4 & 0x07) << 18; $mState = 3; $mBytes = 4; } else if (0xF8 == (0xFC & ($in))) { /* First octet of 5 octet sequence. * * This is illegal because the encoded codepoint must be either * (a) not the shortest form or * (b) outside the Unicode range of 0-0x10FFFF. * Rather than trying to resynchronize, we will carry on until the end * of the sequence and let the later error handling code catch it. */ $mUcs4 = ($in); $mUcs4 = ($mUcs4 & 0x03) << 24; $mState = 4; $mBytes = 5; } else if (0xFC == (0xFE & ($in))) { // First octet of 6 octet sequence, see comments for 5 octet sequence. $mUcs4 = ($in); $mUcs4 = ($mUcs4 & 1) << 30; $mState = 5; $mBytes = 6; } else { /* Current octet is neither in the US-ASCII range nor a legal first * octet of a multi-octet sequence. */ return false; } } else { // When mState is non-zero, we expect a continuation of the multi-octet // sequence if (0x80 == (0xC0 & ($in))) { // Legal continuation. $shift = ($mState - 1) * 6; $tmp = $in; $tmp = ($tmp & 0x0000003F) << $shift; $mUcs4 |= $tmp; if (0 == --$mState) { /* End of the multi-octet sequence. mUcs4 now contains the final * Unicode codepoint to be output * * Check for illegal sequences and codepoints. */ // From Unicode 3.1, non-shortest form is illegal if [1](2 == $mBytes) && ($mUcs4 < 0x0080 || [2]3 == $mBytes) && ($mUcs4 < 0x0800 || [3]4 == $mBytes) && ($mUcs4 < 0x10000 || (4 < $mBytes) || // From Unicode 3.2, surrogate characters are illegal [4]$mUcs4 & 0xFFFFF800) == 0xD800) || // Codepoints outside the Unicode range are illegal ($mUcs4 > 0x10FFFF {
return false;
}
if (0xFEFF != $mUcs4) {
// BOM is legal but we don’t want to output it
$out[] = $mUcs4;
}
//initialize UTF8 cache
$mState = 0;
$mUcs4 = 0;
$mBytes = 1;
}
} else {
/* [5]0xC0 & (*in) != 0x80) && (mState != 0
*
* Incomplete multi-octet sequence.
*/
return false;
}
}
}
return $out;
}

兩個都能轉出我要的東西, 而且第二個在Parsing上對我比較方便, 但是自從PHP支援Multibyte function後, 就不這麼重要了, 兩個function拿來轉同樣10個字的String, 第一個只要0.000017秒, 第二個卻要整整三倍多的0.000052秒. 看來, 我應該會用第一個吧.

太久沒有去鑽PHP, 反應變遲鈍了, 唉.

References

References
1 (2 == $mBytes) && ($mUcs4 < 0x0080
2 3 == $mBytes) && ($mUcs4 < 0x0800
3 4 == $mBytes) && ($mUcs4 < 0x10000
4 $mUcs4 & 0xFFFFF800) == 0xD800) || // Codepoints outside the Unicode range are illegal ($mUcs4 > 0x10FFFF
5 0xC0 & (*in) != 0x80) && (mState != 0