2009年11月25日 星期三
2009年11月6日 星期五
編碼
我對編碼的認識, 就放這囉, 大多是從網路收集整理低
以前電腦的編碼 只有8位
Unicode是由於傳統的字元編碼方式的侷限性而產生的,例如 ISO 8859 所定義的字元雖然在不同的國家中廣泛地使用,可是在不同國家間卻經常出現不相容的情況。
在文字處理方面,Unicode的功用是為每一個字元提供一個唯一的代碼(即一組數字),而不是一種字形
為了使Unicode與已存在和廣泛使用的舊有編碼互相兼容,尤其是差不多所有電腦系統都支援的基本拉丁字母部分,
所以Unicode 的首256字元仍舊保留給ISO 8859-1 所定義的字元,使既有的西歐語系文字的轉換不需特別考量
在表達一個 Unicode 的字元時,通常會用「U+」然後緊接著一組十六進位的數字來表示這一個字元。
補充:
在基本多文種平面(Basic Multilingual Plane,簡稱 BMP)
裏的所有字元,只要使用四位十六進制數(例如 U+4AE0,共支持六萬多個字元)來表示,但在 BMP 以外的字元則需要使用五位或六位十六進制數了。
ASCII就只包含拉丁字母
ISO 8859-1(Latin-1) 是個8位字符集,它以ASCII為基礎,在空置的0xA0-0xFF的範圍內,加入192個字母及符號
Unicode (這只是一種編碼方式, 非實現) : 使用16位的編碼空間。也就是每個字元佔用2個位元組。這樣理論上一共最多可以表示 2的16次方 , 即 65536 個字元
unicode的實現 :
1.UTF-8 (Unicode 的實現方式稱為Unicode轉換格式 Unicode Translation Format,簡稱為 UTF)
如果一個僅包含基本7位ASCII字元的 Unicode 文件,如果每個字元都使用2位元組的原 Unicode 編碼傳輸,其第一位元組的8位始終為0。這就造成了比較大的浪費。
對於這種情況,可以使用 UTF-8 編碼,這是一種變長編碼,它將基本7位ASCII字元仍用7位編碼表示,佔用一個位元組(首位補0)
而遇到與其他 Unicode 字元混合的情況,將按一定演算法轉換,每個字元使用1-3個位元組編碼,並利用首位為0或1進行識別
2.UTF-16
3.BIG5
String sr = new URLCodec().encode("小胖", "utf-8");
以前電腦的編碼 只有8位
Unicode是由於傳統的字元編碼方式的侷限性而產生的,例如 ISO 8859 所定義的字元雖然在不同的國家中廣泛地使用,可是在不同國家間卻經常出現不相容的情況。
在文字處理方面,Unicode的功用是為每一個字元提供一個唯一的代碼(即一組數字),而不是一種字形
為了使Unicode與已存在和廣泛使用的舊有編碼互相兼容,尤其是差不多所有電腦系統都支援的基本拉丁字母部分,
所以Unicode 的首256字元仍舊保留給ISO 8859-1 所定義的字元,使既有的西歐語系文字的轉換不需特別考量
在表達一個 Unicode 的字元時,通常會用「U+」然後緊接著一組十六進位的數字來表示這一個字元。
補充:
在基本多文種平面(Basic Multilingual Plane,簡稱 BMP)
裏的所有字元,只要使用四位十六進制數(例如 U+4AE0,共支持六萬多個字元)來表示,但在 BMP 以外的字元則需要使用五位或六位十六進制數了。
ASCII就只包含拉丁字母
ISO 8859-1(Latin-1) 是個8位字符集,它以ASCII為基礎,在空置的0xA0-0xFF的範圍內,加入192個字母及符號
Unicode (這只是一種編碼方式, 非實現) : 使用16位的編碼空間。也就是每個字元佔用2個位元組。這樣理論上一共最多可以表示 2的16次方 , 即 65536 個字元
unicode的實現 :
1.UTF-8 (Unicode 的實現方式稱為Unicode轉換格式 Unicode Translation Format,簡稱為 UTF)
如果一個僅包含基本7位ASCII字元的 Unicode 文件,如果每個字元都使用2位元組的原 Unicode 編碼傳輸,其第一位元組的8位始終為0。這就造成了比較大的浪費。
對於這種情況,可以使用 UTF-8 編碼,這是一種變長編碼,它將基本7位ASCII字元仍用7位編碼表示,佔用一個位元組(首位補0)
而遇到與其他 Unicode 字元混合的情況,將按一定演算法轉換,每個字元使用1-3個位元組編碼,並利用首位為0或1進行識別
2.UTF-16
3.BIG5
String sr = new URLCodec().encode("小胖", "utf-8");
2009年11月5日 星期四
正規表式示-regex-基礎
字元:
\t Tab
\n 換行
\r 歸位
\f 換頁
\e 跳脫字元
字元類型:
. 任意字元
[abc] a, b, c中的任意字元 ( 同於 a | b | c)
[^abc] 除了a, b, c中的任意字元
[a-zA-Z] a-z或A-Z的任意字元
[abc[def]] 聯集?
[a-z&&[def]] 交集?
\s 空白型的字元 (空白, 跳格, 換行, 換頁, 歸位)
\S 非空白型的字元
\d 指阿拉伯數字 0到9
\D 非阿拉伯數字
\w 字詞字元 [a-zA-Z_0-0]
\W 非字詞字元
邏輯運算子 :
邊界比對:
^ 檔案起始處
$ 檔案結尾處
\b 字詞的邊界
\B 非字詞邊界
\G 前一相符處之未
數量飾詞:
? 表示一個或無
* 零次或多次
+ 一次或多次
{n} 符合n次
{n,} 至少n次
{n,m} 至少n次但不多於m次
群組:
群組0代表整個表示式
群組1表示第一個被括起來的群組
...
樣式標記:
有用到再貼唄
Matcher物件
matches() 只會比對字串一開始的部份, 並全部符合regex才會成功
lookingAt() 只會比對字串一開始的部份, 只要輸入字串開始部份符合就成功
find() 能找出輸入字串中所有此regex存在的地方
find(int start)
groupCount() 回傳 群組0以外的群組數目
group() 回傳前一次比對動作
start() 回傳前一次比對動作中, 找到群組的開始索引值
end() 回傳前一次比對動作中, 找到群組的最後一個字元索引值加一
方便傳入字串與regex, 測試用
下面code的作者 http://www.mindviewinc.com/TIJ4/CodeInstructions.html
\t Tab
\n 換行
\r 歸位
\f 換頁
\e 跳脫字元
字元類型:
. 任意字元
[abc] a, b, c中的任意字元 ( 同於 a | b | c)
[^abc] 除了a, b, c中的任意字元
[a-zA-Z] a-z或A-Z的任意字元
[abc[def]] 聯集?
[a-z&&[def]] 交集?
\s 空白型的字元 (空白, 跳格, 換行, 換頁, 歸位)
\S 非空白型的字元
\d 指阿拉伯數字 0到9
\D 非阿拉伯數字
\w 字詞字元 [a-zA-Z_0-0]
\W 非字詞字元
邏輯運算子 :
邊界比對:
^ 檔案起始處
$ 檔案結尾處
\b 字詞的邊界
\B 非字詞邊界
\G 前一相符處之未
數量飾詞:
? 表示一個或無
* 零次或多次
+ 一次或多次
{n} 符合n次
{n,} 至少n次
{n,m} 至少n次但不多於m次
群組:
群組0代表整個表示式
群組1表示第一個被括起來的群組
...
樣式標記:
有用到再貼唄
Matcher物件
matches() 只會比對字串一開始的部份, 並全部符合regex才會成功
lookingAt() 只會比對字串一開始的部份, 只要輸入字串開始部份符合就成功
find() 能找出輸入字串中所有此regex存在的地方
find(int start)
groupCount() 回傳 群組0以外的群組數目
group() 回傳前一次比對動作
start() 回傳前一次比對動作中, 找到群組的開始索引值
end() 回傳前一次比對動作中, 找到群組的最後一個字元索引值加一
方便傳入字串與regex, 測試用
下面code的作者 http://www.mindviewinc.com/TIJ4/CodeInstructions.html
//: strings/TestRegularExpression.java
// Allows you to easily try out regular expressions.
// {Args: abcabcabcdefabc "abc+" "(abc)+" "(abc){2,}" }
import java.util.regex.*;
public class TestRegularExpression {
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage:\njava TestRegularExpression " +
"characterSequence regularExpression+");
System.exit(0);
}
System.out.println("Input: \"" + args[0] + "\"");
for (String arg : args) {
System.out.println("Regular expression: \"" + arg + "\"");
Pattern p = Pattern.compile(arg);
Matcher m = p.matcher(args[0]);
while (m.find()) {
System.out.println("Match \"" + m.group() + "\" at positions " +
m.start() + "-" + (m.end() - 1));
}
}
}
}
/* Output:
Input: "abcabcabcdefabc"
Regular expression: "abcabcabcdefabc"
Match "abcabcabcdefabc" at positions 0-14
Regular expression: "abc+"
Match "abc" at positions 0-2
Match "abc" at positions 3-5
Match "abc" at positions 6-8
Match "abc" at positions 12-14
Regular expression: "(abc)+"
Match "abcabcabc" at positions 0-8
Match "abc" at positions 12-14
Regular expression: "(abc){2,}"
Match "abcabcabc" at positions 0-8
*///:~
2009年11月2日 星期一
Exception 不見的情況
情況一:
lm.f()中丟出的exception, 被finally中的exception取代掉了
情況二:
若在finally直接return
參考 : http://www.mindview.net/Books/TIJ/
lm.f()中丟出的exception, 被finally中的exception取代掉了
class VeryImportantException extends Exception {
public String toString() {
return "A very important exception!";
}
}
class HoHumException extends Exception {
public String toString() {
return "A trivial exception";
}
}
public class LostMessage {
private static Test monitor = new Test();
void f() throws VeryImportantException {
throw new VeryImportantException();
}
void dispose() throws HoHumException {
throw new HoHumException();
}
public static void main(String[] args) throws Exception {
LostMessage lm = new LostMessage();
try {
lm.f();
} finally {
lm.dispose();
}
}
}
情況二:
若在finally直接return
參考 : http://www.mindview.net/Books/TIJ/
Java note
顯示所有作業系統的環境變數
for (Map.Entry entry: System.getenv().entrySet()) {
for (Map.Entry entry: System.getenv().entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue()); }
由誰呼叫某method
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());
System.out.println(Thread.currentThread().getStackTrace()[2].getMethodName()); System.out.println(Thread.currentThread().getStackTrace()[3].getMethodName());