📄 decoder.java
字号:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
/**
* @author Slice
* licesh@gmail.com
**/
public class Decoder
{
public static class Contact
{
String Name;
String CellPhone;
String Work;
public Contact(String N, String CP)
{
Name = N;
CellPhone = CP;
}
public Contact(String N, String CP, String W)
{
Name = N;
CellPhone = CP;
Work = W;
}
public String getContact()
{
if(Work.equals(""))
if(CellPhone.equals(""))
return Name+",,"+"\r\n";
else
return Name+','+CellPhone+",\r\n";
else
return Name+','+CellPhone+','+Work+"\r\n";
}
}
private ArrayList<Contact> contactsList;
private String contacts;
public Decoder()
{
decodeNokiaBak();
}
public void decodeNokiaBak()
{
try
{
contacts = readFile("2.txt");
contactsList = new ArrayList<Contact>();
int i = 0;
while (true)
{
int si = contacts.indexOf("BEGIN:VCARD", i);
if (si == -1) break;
si += 11;
i = si;
int ei = contacts.indexOf("END:VCARD", i);
i = ei + 9;
readOneContact(si, ei - 1);
}
int j = 0;
i++;
} catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
Decoder de = new Decoder();
de.writeFile("contacts.csv");
}
public void readOneContact(int startIndex, int endIndex)
{
String contact = contacts.substring(startIndex, endIndex+1);
contact += '\0';
char t;
// read name
int index = contact.indexOf("N:", 30);
if (index == -1)
{
index = contact.indexOf("UTF-8");
index += 6;
}
else index += 2;
String ntemp = new String();
for (int j = 0; contact.charAt(index) != ';'; j++, index++)
ntemp += contact.charAt(index);
String name = qpDecoding(ntemp);
// read CELL
String cell = new String();
int cindex = contact.indexOf("CELL:", index);
if (cindex != -1)
{
index = cindex;
index += 5;
t = contact.charAt(index);
for (int j = 0; t == '+' || t == ' ' || t >= '0' && t <= '9'; j++)
{
cell += t;
t = contact.charAt(++index);
}
}
// read WORK
String work = new String();
int windex = contact.indexOf("WORK:", index);
if (windex != -1)
{
index = windex;
index += 5;
t = contact.charAt(index);
for (int j = 0; t == '+' || t == ' ' || t >= '0' && t <= '9'; j++)
{
work += t;
t = contact.charAt(++index);
}
}
//
contactsList.add(new Contact(name, cell, work));
}
private String readFile(String fileName)
{
try
{
BufferedReader fr = new BufferedReader(new FileReader(fileName));
StringBuffer out = new StringBuffer();
String thisLine = new String();
while (thisLine != null)
{
thisLine = fr.readLine();
if (thisLine != null)
{
out.append(thisLine);
}
}
fr.close();
return out.toString();
} catch(Exception e)
{
System.out.print(e.toString());
return null;
}
}
private void writeFile(String fileName)
{
try
{
BufferedWriter fw = new BufferedWriter(new FileWriter(fileName));
fw.write("Name,Mobile Phone,Work\r\n");
for(int i=0; i<contactsList.size(); i++)
{
fw.write(contactsList.get(i).getContact());
}
fw.close();
} catch(Exception e)
{
e.printStackTrace();
}
}
/**
* quoted-printable编码
*/
public static String qpEncodeing(String str)
{
char[] encode = str.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < encode.length; i++)
{
if ((encode[i] >= '!') && (encode[i] <= '~') && (encode[i] != '=')
&& (encode[i] != '\n'))
{
sb.append(encode[i]);
}
else if (encode[i] == '=')
{
sb.append("=3D");
}
else if (encode[i] == '\n')
{
sb.append("\n");
}
else
{
StringBuffer sbother = new StringBuffer();
sbother.append(encode[i]);
String ss = sbother.toString();
byte[] buf = null;
try
{
buf = ss.getBytes("utf-8");
} catch(UnsupportedEncodingException e)
{
e.printStackTrace();
}
if (buf.length == 3)
{
for (int j = 0; j < 3; j++)
{
String s16 = String.valueOf(Integer.toHexString(buf[j]));
// 抽取中文字符16进制字节的后两位,也就是=E8等号后面的两位,
// 三个代表一个中文字符
char c16_6;
char c16_7;
if (s16.charAt(6) >= 97 && s16.charAt(6) <= 122)
{
c16_6 = (char)(s16.charAt(6) - 32);
}
else
{
c16_6 = s16.charAt(6);
}
if (s16.charAt(7) >= 97 && s16.charAt(7) <= 122)
{
c16_7 = (char)(s16.charAt(7) - 32);
}
else
{
c16_7 = s16.charAt(7);
}
sb.append("=" + c16_6 + c16_7);
}
}
}
}
return sb.toString();
}
/**
* quoted-printable解码
*
* @author issuesr
* @param str
* @return String
* @date 2007-6-24
*/
public final static String qpDecoding(String str)
{
if (str == null) { return ""; }
try
{
StringBuffer sb = new StringBuffer(str);
for (int i = 0; i < sb.length(); i++)
{
if (sb.charAt(i) == '\n' && sb.charAt(i - 1) == '=')
{
// 解码这个地方也要修改一下
// sb.deleteCharAt(i);
sb.deleteCharAt(i - 1);
}
}
str = sb.toString();
byte[] bytes = str.getBytes("US-ASCII");
for (int i = 0; i < bytes.length; i++)
{
byte b = bytes[i];
if (b != 95)
{
bytes[i] = b;
}
else
{
bytes[i] = 32;
}
}
if (bytes == null) { return ""; }
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
for (int i = 0; i < bytes.length; i++)
{
int b = bytes[i];
if (b == '=')
{
try
{
int u = Character.digit((char)bytes[++i], 16);
int l = Character.digit((char)bytes[++i], 16);
if (u == -1 || l == -1)
{
continue;
}
buffer.write((char)((u << 4) + l));
} catch(ArrayIndexOutOfBoundsException e)
{
e.printStackTrace();
}
}
else
{
buffer.write(b);
}
}
return new String(buffer.toByteArray(), "UTF-8");
} catch(Exception e)
{
e.printStackTrace();
return "";
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -