搞定PHP+MYSQL中文乱码问题(转)

在Google上找了很久,大部分的看似很牛的文章都没解决我的问题,但这篇搞定了,解决的很彻底,转自http://i-cando.cn/blogcn/topic.php?id=54:

 PS:我要解决的是用GB2312编码进行通讯,将下述utf8改为gb2312即可并注意将下述单引号改为键盘第二排的第一个字符`.

先讲下两个字符集的区别:

gb2312是标准中文字符集。

UTF-8 是 UNICODE 的一种变长字符编码,即 RFC 3629,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。 UTF-8 是字节顺序无关的,它的字节顺序在所有系统中都是一样的,排序更加容易。因此 UTF-8 具有更高的性能。

不过如果是纯英文的话,用什么都可以,用GB2312也没问题。

再分析下出现乱码的原因

mysql+php产生乱码原因:
1. mysql数据库默认的编码是utf8,如果这种编码与你的PHP网页不一致,可能就会造成MYSQL乱码.
2. MYSQL中创建表时会让你选择一种编码,如果这种编码与你的网页编码不一致,也可能造成MYSQL乱码.
3. MYSQL创建表时添加字段是可以选择编码的,如果这种编码与你的网页编码不一致,也可能造成MYSQL乱码.
4. 用户提交页面的编码与显示数据的页面编码不一致,就肯定会造成PHP页面乱码.
5. 如用户输入资料的页面是big5码, 显示用户输入的页面却是gb2312,这种100%会造成PHP页面乱码.
6. PHP页面字符集不正确.
7. PHP连接MYSQL数据库语句指定的编码不正确.
最后讲 根治 的处方:
拿UTF8来举例

1、 保证页面的编码
如果是html 那么别忘了在 文件开头写上

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
如果是 php那么 记得在文件最上方写上

lzy © 2008, View php source

  1. header(“Content-type: text/html;charset=utf-8″);

Parsed in 0.021 seconds

保证文件的编码必须是 UTF-8
解决方法 (1)把你的文件用记事本打开 ,选文件另存为,在文件名的下面有个编码  看看字符集是不是UTF-8 如果不是请修改

2、 保证数据库是UTF8
在添加表的时候  需要设置编码为 UTF8
如果已经添加了 那么可以
在PHPMYADMIN 中查看表结构  的‘整理’属性上 是否为 utf8_general_ci
如果不是 请修改

lzy © 2008, View php source

  1.  

  2. ALTER TABLE ‘gbook’ DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

  3.  

Parsed in 0.049 seconds

数据库和字段 的编码同理:

lzy © 2008, View php source

  1.  

  2. ALTER DATABASE ‘testdata’ DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

  3. ALTER TABLE ‘ testdata’ CHANGE ‘test’ ‘test’ VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin

Parsed in 0.118 seconds

3、 PHP在连接数据库的时候加上一句:set names utf8

lzy © 2008, View php source

  1.  

  2. mysql_connect(‘localhost’,‘user’,‘password’);

  3. mysql_select_db(‘mydb’);

  4. mysql_query(“set names utf8;”);//**设置字符集***

  5.  

Parsed in 0.081 seconds

这样就做到万无一失了,如果还有什么问题 大家可以给我留言 我会及时回复的

Comments (1)

Joomla后记

这两天又重拾Joomla,有了一些新的心得:

从UI设计者的角度,页面是根据布局划分的,如header, footer, left, right, main等.这些元素构成了teamplate里的position.
从程序开发者的角度,页面是根据功能划分的,如导航栏(nav),文章列表(list),广告区(banner),投票(poll)等.这些元素构成了module.
因此,在joomla里程序开发者编写的功能模块(module)要显示在页面上,只需要通过指定module放在template的哪一个position就可以了.这样来看,以前不解的地方变得合理起来了.

———————————————-

Joomla的设计应用了MVC模式,创建一个新的module,需要编写一个helper.php实现数据获得部分(Model),mod_**.php实现主调用(Control),通常数据习惯放在名为$list的变量里.tmpl/default.php实现界面显示部分(View).

———————————————-

每个页面只能有一个组件,每个组件的views目录下对应组件可产生的页面模块文件,有点像asp.net的用户控件中的.ascx文件,也是前台UI界面,但UI设计者在模板设计时不能修改模块的界面.

可以这么理解,joomla的页面功能由组件实现,比如新闻列表和新闻内容,由com_content这个组件提供views/section和view/article来实现,为了丰富每个页面,可以将module拼装在页面上,因此,通常将登陆框,导航栏这种需要在多个页面中被复用的功能做成module,如果将来程序开发者希望对某个组件的功能进行扩展,那么可以编写插件,如为新闻内容的显示界面添加tag显示,那么就可以编写一个content的插件放在plugins/content/目录下.

———————————————-

1.先将网站按功能划分,如用户信息方面的/内容方面的(如新闻)/投票方面的/友情链接方面的等,形成不同的component定义.
2.然后针对每个功能提出不同的功能视图,即该功能的不同表现形式(组织形式,这里指数据的组织形式,而非显示样式,显示样式由模板来决定),如内容的列表显示及内容的Detail显示等,形成每个component的view定义.
3.接着每个component按MVC模型进行组建,编写共同的controller及不同的model和view.
4.组件实现并安装后,需要在网站上提供一个调用组件的入口,如在第一个组件com_content的某个视图中提供一个链接地址(通常这种入口链接会以模块的方式组装在组件页面上,如导航栏模块)来调用新组件.
5.如果组件的视图需要被多个页面调用的,像一个独立的box一样,那么就要创建成module而不是component view,举例:内容方面的功能创建了一个组件com_content,但有一个需求是列出前5条高点击率新闻,并且在多个页面中都需要显示它,此时就要创建成module.
6.创建成module的好处是,这个功能模块将可以被复用并组装到任意页面,典型的如footer, poll等.一个页面可以使用多个模块,这使用页面变得灵活并且更丰富.
7.另外,在设计组件时要考虑组件功能的扩展,提供一些接口可以使得新的idea在组件Release之后还能够通过插件的方式将其加入到组件功能中去,如com_content组件提供了onAfterDisplayContent接口,使得它的插件可以向该事务注册新的观察者调用.(这段的理解不一定对,比如组件的接口如何暴露出来?)

Comments (16)

Web服务(Web Service)

Download: web-service.pptx

本周二准备的presentation,主要介绍google和ebay所提供的Web服务以及使用到的相关技术.

Comments (19)

W3C标准细数

Download: w3c.docx

摘要:

1.       HTML4.01 + CSS2 + JavaScript
2.       XML
3.       DTD or XML Schema
4.       XHTML1.0
5.       XLink + XPointer + XForm
6.       XPath2.0
7.       XQuery1.0
8.       XSL1.1(XSLT2.0 + XSL-FO)
9.       SOAP
10.     WSDL
11.     UDDI
12.     DOM3 + SAX
13.     WAP
14.     SMIL2.1
15.     SVG
16.     RDF(URI) 
17.     RDF Schema + OWL
18.     SPARQL
19.     RSS2

Comments (2)

边学边记之Joomla

关于分类:

jos_sections对应于单元,单元可以理解为最父级的网站分类,比如示例数据库中网站的单元分为News/FAQ/About三种.

jos_categories对应于分类,每个分类都有一个section,从数据库里可以看出,section字段设计为文本类型,它不仅仅可以指定为jos_sections表里的section id,也可以自定义.

这里我的理解是,可以在后台中动态进行管理的单元被纳入了jos_sections表进行管理,其它可能由某个组件绑定或使用的分类就直接自定义section,比如常见的友情链接组件,它的分类单元应该为友情链接,但友情链接并不做为单元存储在jos_sections表中,而是自定义了section字段值com_weblinks代表为友情链接单元.

这里我的疑问是,
1.为什么不将组件名称也做为一个单元纳入jos_sections表进行管理呢?可以定义一个字段来表示是可管理的单元,还是自动产生的不可管理单元.当然这样管理的话当组件被卸载时要同步删除jos_sections表和jos_categories表.
2.从jos_categories表结构来看,分类是存在parentid的,但后台管理中并没有发现分类存在N级关系,这个功能是可支持的么?

关于组件/插件:

jos_components对应于组件,jos_plugins对应于插件,组件和插件的区别以及如何编写,回头我再研究.

关于菜单/模块/布局:

jos_menu_types对应于菜单模块,通常页面左边的导航,上方的导航,用户控制面板等都属于常见菜单模块,jos_menu对应于菜单项,用于管理每个菜单模块中的具体菜单项,通常菜单项为一个链接,它可以指向系统预设的一些功能.

这里我的疑问是,
1.”menutype记录菜单类型目前系统分为四种菜单mainmenu(主菜单),topmenu(顶菜单),othermenu(其他菜单),usermenu(用户菜单)”这句话似乎没什么意义,这四个菜单模块貌似是可以删除的,并且没有特殊含义啊…
2.如何修改系统预设的可选菜单项呢?
menu

jos_modules对应于模块,用于管理网站中一些固定模块的布局,如上面提到的菜单模块将会在模块管理中决定它是否显示,显示在哪些页面(显示在哪些页面由jos_modules_menu管理,对应于菜单分配这个功能,这个功能的常见用途是指定某个模块只显示在首页,或指定的某些页面,如投票模块或用户控制面板等)以及显示在页面的什么位置.系统也预置了一些模块供用户添加,比如页脚模块,投票模块等.

这里我的疑问是,如何添加系统预设的模块呢?投票模块是否在投票组件安装时自动产生的呢?
module
关于布局,这里我的理解是,
模板的设计者先在templateDetails.xml中使用position标签指定页面布局由几大位置决定,比如left,top,right,user1,user2等.然后在模块管理中指定每个模块显示在什么位置,以及在该位置中的次序,比如左边导航以及用户控制面板都设定显示在left位置,然后通过次序决定谁显示在上面,谁显示在下面.

这里我的疑问是,
模块通过位置来控件,但位置是定义在模板的配置文件中的,那么显然模块的位置就会受模板限制,理想中应该是完全由模板来控制显示哪些模块以及模块的位置,但目前来看,修改模板的同时也可能需要修改模块信息才能达到换肤的效果.比如模板B添加了一个position叫user5,并且将模块2显示在user5位置,当切换到模板A时模块2的显示位置就无效了.感觉需要同时修改两个地方,很别扭…那么好处是什么呢?

关于模板:

jos_templates_menu对应于模板,用于定义模板与菜单之间的关系,”这就是为什么joomla可以采用多模板机制,可以为不同的菜单分配不同的模板”这句话是什么含义,回头我再研究.

Comments (26)

宽字符处理函数函数与普通函数对照表

字符分类:
iswalnum()  isalnum
()  测试字符是否为数字或字母
iswalpha
()  isalpha()  测试字符是否是字母
iswcntrl
()  iscntrl()  测试字符是否是控制符
iswdigit
()  isdigit()  测试字符是否为数字
iswgraph
()  isgraph()  测试字符是否是可见字符
iswlower
()  islower()  测试字符是否是小写字符
iswprint
()  isprint()  测试字符是否是可打印字符
iswpunct
()  ispunct()  测试字符是否是标点符号
iswspace
()  isspace()  测试字符是否是空白符号
iswupper
()  isupper()  测试字符是否是大写字符
iswxdigit
()  isxdigit()  测试字符是否是十六进制的数字


大小写转换:
towlower
()  tolower()  把字符转换为小写
towupper
()  toupper()  把字符转换为大写


字符比较:
wcscoll
()  strcoll()  比较字符串


日期和时间转换:
strftime
()  根据指定的字符串格式和locale设置格式化日期和时间
wcsftime
()  根据指定的字符串格式和locale设置格式化日期和时间, 并返回宽字符串
strptime
()  根据指定格式把字符串转换为时间值, 是strftime的反过程


打印和扫描字符串:
fprintf
()  /fwprintf()  使用vararg参量的格式化输出
fscanf
()  /fwscanf()  格式化读入
printf
()  使用vararg参量的格式化输出到标准输出
scanf
()  从标准输入的格式化读入
sprintf
()  /swprintf()  根据vararg参量表格式化成字符串
sscanf
()  以字符串作格式化读入
vfprintf
()  /vfwprintf()  使用stdarg参量表格式化输出到文件
vprintf
()  使用stdarg参量表格式化输出到标准输出
vsprintf
()  /vswprintf()  格式化stdarg参量表并写到字符串


数字转换:
wcstod
()  strtod()  把宽字符的初始部分转换为双精度浮点数
wcstol
()  strtol()  把宽字符的初始部分转换为长整数
wcstoul
()  strtoul()  把宽字符的初始部分转换为无符号长整数


多字节字符和宽字符转换及操作:
mblen
()  根据locale的设置确定字符的字节数
mbstowcs
()  把多字节字符串转换为宽字符串
mbtowc
()  /btowc()  把多字节字符转换为宽字符
wcstombs
()  把宽字符串转换为多字节字符串
wctomb
()  /wctob()  把宽字符转换为多字节字符


输入和输出:
fgetwc
()  fgetc()  从流中读入一个字符并转换为宽字符
fgetws
()  fgets()  从流中读入一个字符串并转换为宽字符串
fputwc
()  fputc()  把宽字符转换为多字节字符并且输出到标准输出
fputws
()  fputs()  把宽字符串转换为多字节字符并且输出到标准输出串
getwc
()  getc()  从标准输入中读取字符, 并且转换为宽字符
getwchar
()  getchar()  从标准输入中读取字符, 并且转换为宽字符
None gets
()  使用fgetws() 
putwc
()  putc()  把宽字符转换成多字节字符并且写到标准输出
putwchar
()  putchar()  把宽字符转换成多字节字符并且写到标准输出
None puts
()  使用fputws() 
ungetwc
()  ungetc()  把一个宽字符放回到输入流中


字符串操作:
wcscat
()  strcat()  把一个字符串接到另一个字符串的尾部
wcsncat
()  strncat()  类似于wcscat()  , 而且指定粘接字符串的粘接长度.
wcschr
()  strchr()  查找子字符串的第一个位置
wcsrchr
()  strrchr()  从尾部开始查找子字符串出现的第一个位置
wcspbrk
()  strpbrk()  从一字符字符串中查找另一字符串中任何一个字符第一次出现的位置
wcswcs
()  /wcsstr()  strchr()  在一字符串中查找另一字符串第一次出现的位置
wcscspn
()  strcspn()  返回不包含第二个字符串的的初始数目
wcsspn
()  strspn()  返回包含第二个字符串的初始数目
wcscpy
()  strcpy()  拷贝字符串
wcsncpy
()  strncpy()  类似于wcscpy()  , 同时指定拷贝的数目
wcscmp
()  strcmp()  比较两个宽字符串
wcsncmp
()  strncmp()  类似于wcscmp()  , 还要指定比较字符字符串的数目
wcslen
()  strlen()  获得宽字符串的数目
wcstok
()  strtok()  根据标示符把宽字符串分解成一系列字符串
wcswidth
()  None 获得宽字符串的宽度
wcwidth
()  None 获得宽字符的宽度


另外还有对应于memory操作的 wmemcpy
()  , wmemchr()  , wmemcmp()  ,wmemmove()  , wmemset() 

Comments (2)

浅谈C中的wprintf和宽字符显示

(转自http://blog.csdn.net/lovekatherine/archive/2007/11/06/1868724.aspx)

——————————————————

Cyndi: 先补两句,在按照下面的测试代码验证时,仍然遇到了问题.

首先,L”中文”这种通过L来转换成unicode的方式不是万能的,我试了几台linux终端都不支持这个方式,因为标准C对于L的解释是能转换ASIC,这一点因系统而宜.事实上windows是支持非ASIC字符的.

其次,printf+%ls与wprintf+%ls在我试的几台linux终端上表现是不一样的,printf+%ls可以成功输出中文,但wprintf+%ls却死活也不行,具体原因不详,(类似的,windows上测试这两个的输出结果是相同的).

最后,clocale这个头文件在windows下编译成功,但在linux下改成locale.h才编译通过.而setlocale这个函数的第二个参数在windows下用了chs,而linux下我用了zh-CN.这一点可用locale -a查询该平台支持的集合.

——————————————————

今天在CSDN的Blog首页看到一篇文章“也谈计算机字符编码 ”,由于前一阵业余翻译了“UTF-8 and Unicode FAQ for Unix/Linux”一文,自己对字符集、编码和Unicode等内容一直保着者很强的兴趣,自然不会放过这样的文章。

作者的文章写得很明白易懂,虽然有一些概念上的细节问题我觉得有商榷之处;作者还给出一个简单的在windows下使用wprintf正确输出字符串“中文”的小例子,我linux下模仿作者给出的示例代码写了如下的示例代码:

#include <cstdio>
#include
<cstdlib>
#include
<clocale>
#include
<cwchar>

int main(int argc, char * argv[])
{
wchar_t wstr[]
= L中文;
setlocale(LC_ALL,
zh_CN.UTF-8);
wprintf(L%s\n,wstr);

return 0;
}

这里需要说明的是我的机器的locale为”zh_CN-UTF-8″

然而程序的运行结果却让我很诧异

whodare@whodare:$ ./a.out
-N

我的第一反应就是作者的示例代码是不是有问题,毕竟这里面调用的全都是C的标准库函数,不应该存在移植性问题;然而,我找了台windows机器测试作者的代码,结果让我很郁闷,一切正常……

为什么我在Linux下的程序就不对呢?我很不服气,于是开始以各种关键字进行搜索,想看看别人是否遇到过类似的问题。一个搜索结果引起了我的主意,有人说问题出在wprintf中的格式转换符上,将%s替换成%ls就没有这样的问题。带着几分怀疑,我修改了上面的程序,编译运行后,居然真的就没问题了

#include <cstdio>
#include
<cstdlib>
#include
<clocale>
#include
<cwchar>

int main(int argc, char * argv[])
{
wchar_t wstr[]
= L中文;
setlocale(LC_ALL,
zh_CN.UTF-8);
wprintf(L
%s ,wstr);
wprintf(L
%ls ,wstr);

return 0;
}

上述代码的运行结果

whodare@whodare:$ ./a.out
-N
中文

问题解决了,可我还是感到迷茫:格式转换符”ls”和“s”的区别是什么?为什么原来的程序会出问题?“-N”这个字符串是怎么冒出来的?为什么作者在windows下的程序就不存在该问题?

这么多的疑惑堵在心口,我哪能心安呢。知其然还要知其所以然嘛!花了一个下午的时间仔细读了下wprintf的manual,并在gdb的帮助下做了各种试验,终于算是把我的疑惑基本都解决了。

一、以下的所有试验都是以“中文”为例,因此有必要先把它的Unicdoe码值、UTF-8编码都列出来,以便于更好的理解下文

‘中’ Unicode码值:U+4E2D UTF-8 编码 e4 b8 ad
‘文’ Unicode码值:U+6587 UTF-8 编码 e6 96 87

二、我们需要理解用char[ ]和wchar_t [ ]来存放“中文”时有什么不同

char str[]=中文;
wchar_t wstr[]
= L中文;

我们使用gdb这个强大的工具来查看str[]和wst[]中究竟都存放了哪些值(请注意颜色之间的对应关系)

(gdb) x /8xb &str
0xbf83decd: 0xe4 0xb8 0xad 0xe6 0×96 0×87 0×00 0xf0
(gdb) x
/12xb &wstr
0xbf83dec0: 0×2d 0×4e 0×00 0×00 0×87 0×65 0×00 0×00
0xbf83dec8: 0×00 0×00 0×00 0×00

不难看出,char str[ ]中存储的是“中文”的UTF-8编码,这是因为我的机器的locale是zh_CN.UTF-8,程序源文件的自然采用的是UTF-8编码,因此编译器在处理 char str[ ]=”中文”; 时,t它对str[]所做得初始化实际上可以理解成 char str[ ]={ 0xe4,0xb8,0xad,0xe6,0×96,0×87,0×00}

而wchar_t wstr[ ]中存放的是“中文”的Unicode码值,这符合C标准对宽字符的定义。这里需要解释的是C标准中规定宽字符是16 bit的字符,而从GNU glibc 2.2开始,类型wchar_t只用于存放32-bit的ISO 10646码值(你可以粗略的把ISO 10646理解成Unicode,尽管它们并不是一回事),而独立于当前使用的locale;因此在上面的输出中,我们看到每个Unicode码值用 32bit表示,而不是16bit。

三、关于%s和%ls的区别

我搜到了一篇帖子(很伤感,我再此发现在CS领域,最靠的住的资料总是英文的),里面对各种格式转换符有详细的解释,愿意看原文的同学直接忽略本段文字…….

http://www-ccs.ucsd.edu/c/lib_prin.html

首先,%ls和%s的区别很简单,%ls意味着将对应的参数会被当作基于宽字符的字符串(wide chraracter string )看待,而%s则意味着对应的参数会被当作普通字符串(multi-byte string)看待。

其次,不要因为上面一句话而错误的认为%s只用于printf,而%ls只用于wprintf 。实际上,(printf, wprintf) 和(%s,%ls)这两个元组之间是相互独立的,也就是说它们之间的四种组合都是可以的。

再次,printf用于byte stream,即输出流中的每个字符颤1 byte;而wprintf则用于wide stream,输出流中的每个字符不止 1 byte。

说了一堆废话,还是结合实例来看看%ls和%s的区别吧

例子1 printf + %s + wstr

printf(%s ,wstr);

whodare@whodare:$ .
/a.out
-N

哈,这个郁闷的”-N”又一次出现!为什么会出现呢?让我来分析一下printf在执行时所完成的操作吧。

这里用了%s, printf 就会将对应的参数wstr视为普通字符串(尽管我们清楚他是个wcs而不是mbs);另一方面,我们已经看到了wstr[ ]的内存布局,其前3 byte为 0×2d ,0×4e,0×00。我们都知道C中的字符串以’\0′为结束标志,因此printf只会处理wstr[ ]中的前三个byte,而查一查ASCII表,0×2d对应字符’-',0×4e对应字符’N',所以我们会看到”-N”这个诡异的输出。

例子2 printf + %ls + wstr

printf(%ls ,wstr);

whodare@whodare:$ .
/a.out
中文

使用了%ls,printf会将对应的参数视为宽字符串(wcs),而printf又对应byte stream,因此这里要对宽字符(wcs)进行转换,变成普通的字符串(mbs)。这里的转换是printf通过对每个宽字符隐式的调用wcrtomb ()这个标准库函数完成的。按么,wcrtomb()这个函数进行是按照什么规则进行转换的?这就是setlocale()的作用所在了,wcrtomb 会依据程序员设定的locale,将wcha_t中存放的码值,转换为相应的的多字节编码。

回到例子中,我的机器的locale为zh_CN.UTF-8,对应的编码为UTF-8,因此wstr[ ]中存放的Unicode码值会转换为UTF-8编码的形式输出到标准输出流中,这样采用UTF-8编码的console就能正确识别受到的字节流并显示出”中文”

例子3 wprintf + %s +wstr (最初的代码!)

wprintf(L%s ,wstr);

whodare@whodare:$ .
/a.out
-N

使用了%s,wprintf会将对应的参数视为普通字符串mbs,尽管我们还是很清楚它其实是个wcs。wprintf 使用的是wide stream,因此需要将所给的mbs参数转换为wcs再由wprintf完成输出;这个转换是由wprintf隐式的对mbs不断调用mbrtowc来完成,转换规则依然是和locale相关的。

我们知道wstr的内存布局为:
0×2d 0×4e 0×00 0×00
0×87 0×65 0×00 0×00
0×00 0×00 0×00 0×00
该”mbs”的转换结果为 L‘0×2d’ + L ‘0×4e’ + L ‘0×00′ ,最终输出结果又是讨厌的”-N”

该”mbs”的转换结果为 L‘0×2d’ + L ‘0×4e’ + L ‘0×00′ ,最终输出结果又是讨厌的”-N”例子4 wprintf + %ls+ wstr

wprintf(L%ls ,wstr);

whodare@whodare:$ .
/a.out
中文

使用了%ls,wprintf会将对应参数视为宽字符串wcs,这次终于没有搞错。因此wprintf会顺利的将给定的宽字符串写入标准输出流,最终正确显示”中文”

看完这4个例子,你对wprintf、printf和%ls 、%s的使用还有疑惑么?

四、小结

1。要清楚%ls和%s的意义在于指明所期待的参数是何种字符串,而printf和wprintf的区别在于所使用的是不同类型的stream

2。貌似在linux下输出“中文”的正确方法是 wprintf( “%ls\n”,L”中文”) ,而引文中作者在Windows成功操作的wprintf(”%s\n”, L”中文”)在linux无法正确工作,至于为何wprintf这个标准库函数在两个系统下有不同表现,我是无心再向下深挖了,难道这又是VC一处不符合标准的地方?…….

3 。貌似还有一个%S,单独用于表示对应参数是宽字符串

谁能告诉我该问题的答案,不盛感激…….

Comments (5)

终于开始要还贷了~~

4月份买的房子,到今天半年过去了,贷款终于批下来了,10月20号是商业贷款还款日,11月15号是公积金贷款还款日.

由于我和snow还没有领证的前提下办理的贷款,所以涉及公积金的贷与还就比常人想象的要繁杂,查了N多地方,都是众说纷纭,各持一词,因此有必要在这里把我搞明白的部分记录下来,以慰后人.这里参考的是南京市公积金管理中心的政策法规.

公积金贷款:
个人贷款上限15万,夫妻双方共计可贷30万,但如果A和B没有领证,虽然同为产证共有人,但也只能有一个使用公积金贷款,因此A和B只能由其中一个人贷15万.假定这个人是A.

公积金提取:
在几种前提下公积金是可以提取的,常见的是逐月还款,逐年还款,购房后一次性取现,离退休,重病,户口迁出等.
1.采取逐月还款方式,假定每月公积金还款额为2000,A的公积金每月缴存额是1600,那么首先A必须在公积金帐户里留存缴存额的12倍(即1600*12=19200),如果不满足这个条件,则无法办理逐月还款.
其次,虽然每月还款额为2000,但逐月还款规定只能以缴存额1600元替A归还公积金贷款,也就是说每月A还需自已拿出400元还公积金贷款.
最后,由于逐月还款的前提是用公积金帐户归还”本人或配偶”的公积金贷款,因此做为B来说,即便他也是产权人,由于B未办理公积金贷款,故B无法通过逐月还款方式提取自己的公积金(A与B领证之后可做为配偶办理逐月还款).

2.采取逐年还款方式,事实上逐年还款是指从公积金帐户中取出一部分钱用于提前还贷,这部分钱不是以现金方式提取,而是只能用于提前还贷,现有规定是先还公积金贷款,还清后方可还商业贷款.同样,逐年还款也仅限贷款本人或配偶,因此B仍然无法通过逐年还款方式提取自己的公积金.

3.购房后一次性取现,这是常规情况下取现的唯一机会,注意是从签发购房协议的日期开始算起一年内可以取现一次,但要注意的是假定A和B是4月购房,贷款是10月批下来的,那么取现的大限之日是在次年的4月之前.
由于因购房导致的取现只要求是产权人即可,因此A和B均可通过取现来提取自己的公积金.
假定A和B的公积金帐户分别有余额3万,对于A来讲,如果办理了逐月还款,那么A可提取的现金上限即为余额-12个月缴存额(即30000-12*1600=10800),同时还应注意,如果A的公司出现未按时缴存的情况,那么保险起见,A应再多留1~2个月的缴存额以备不时之需,一旦余额不足12个月缴存额,逐月还款的协议就会被中止.
对于B来讲,由于婚前他无法办理逐月还款,因此B只需在帐户中保留1元钱即可,但也应注意,如果B将帐户中的钱全部提取出来,那么当A和B领证之后B再办理逐月还款时,仍需保证帐户余额有12个月的缴存额.
另外,对于公积金取现,每购房一次即可取现一次.事实上取现的上限还有其它规定,比如不能超过购房的首付款等.

4.离退休也可一次性取现,只需在帐户中保留1元钱即可.具体细则不清楚….

5.重病取现即公积金帐户的本人/配偶或子女(竟然不含父母…)有一方当年医疗消费超过4万,则超出部分可从公积金帐户支取,假定当年医疗消费达5万,公积金余额有10万,那么也只能从公积金帐户取现1万….

6.户口迁出或出境定居,这可能是相当于销户了,此时可以全部取现,一毛也不用保留.如果界时A和B的帐户余额过多,哈哈,那咱就考虑换个户口试试~~

==============

我和snow当初对公积金细则了解的不够透彻就匆忙办理了贷款,年限仅为4年,这意味着4年后我们的贷款还清,如果不购买第二套住房,那么我们就只能看着公积金帐户里的钱一年年增长,数额越来越茁壮,而我们却继续过着穷人的日子啊…..So,我们一定要买第二套住房~~

Comments (19)

项目管理2

先零散记一些,以后有机会再整理吧.

—————————————-

IBM的管理方法(WWPMM)核心为产品分解结构、工作分解结构、组织分解结构.

让我想到做项目总结时,我们在划分管理方法时是分为项目管理、组织管理、基本元素.

—————————————-

对于mFone的团队来讲,应该说已经向一个大型团队运作一个大型项目进化了,项目管理涉及的方面也比较全了,团队的发展空间比较自由,所以很多项目管理方法是由需求自然而然触发的,然后在管理团队的努力下结合了理论知识和实践经验一点点形成的,但对于有些团队而言,有很多东西是无法搬项目管理的方法,比如mFone的项目很完整,而很多小项目缺头少尾,往往特殊性非常强.比如SDK这样的项目,它属于技术支持的项目,在运作的时候就会有很多不同的地方,有些管理方法是不适合在这种团队上使用的,以后再详细写.

有人提到: 华为在项目管理方面的先固化僵化的做法还是值得很多企业借鉴. 事实上这种做法在很多企业也会不适用,什么样的企业不适用呢,比如mFone的这种团队,大部分成员对凭空来的管理方法接受度非常低,很容易水土不服.

—————————————-

Comments (2)

项目管理1

如果有空,想要把以前mFone项目中涉及到的方方面面寻个机会记录下来,这是一笔宝贵的经验.择日不如撞日,逛mypm论坛时突然就有写的冲动,那么今天就开个头吧~

IBM的项目管理方法有13种,它本身是对PMBOK的补充了,下面提到的在mFone项目中很多都是有需求的并且在项目过程中主动或被动的被触发的.站在我的角度在mFone项目中有所涉及并且有一定应用的项目管理方法:

1. 变更管理Change Management

说明:在Dante项目中后期,客户的需求变更非常频繁,我们不得不重视变更管理,并因此产生了很多因事而宜的管理方法,比如产生了确认变更的流程,通过会议来confirm需确认的bug等等,以后再详细的写.

3. 交付管理Delivery Management

说明:做为一个产品化项目一定是有交付物的,Mars项目还停留在随意交付的情况,交付物只有binary package,并且多个研发部门分别向QA交付,导致QA还要承担集成的责任,到了Dante项目出现了多个部门要同时在一个milestone交付多样交付物(如UI文档/镜像等),QA无法也不应再承担集成的责任了,这使得当时的应用部成为所有部门对QA输出的统一路径,交付过程也增加了相对详细的交付说明,配置管理也出现了,另外交付管理由于涉及多个问题,还产生了对多个交付品之间同步问题的解决方案等等.

7. 质量管理Quality Management

说明:在所有的mFone产品中,质量管理是最早被得到重视的,因此我们的项目管理方法中最早成形的就是bug管理系统,在Dante这个项目中质量管理更细化到了每个测试阶段,不同的测试目标等等.

10. 跟踪和控制Track And Control

说明:当同一时刻N多任务在N多个人之间进行,跟踪和控制就被触发了,Leader需要知道每个任务的进展以及是否遇到困难以便及时调整资源分配并且控制预期目标实现的风险,曾经有过很多不同的excel表用于跟踪任务完成的情况,设立专人而且每天晚上还会汇总进度报告,但管理的同时为了得到准确的进度工程师的工作也不得不被打断,也曾经尝试过使用专门的系统由工程师在下班前主动填写进度,但在项目繁忙的情况下专人Push的方法显得更有效.

13. 工作计划管理Work Plan Management

说明:由于Dante项目是产品项目,客户更关心项目时间,因此以往粗略的计划无法适应客户的需求,各部门按照各项目阶段都需要有工作计划,甚至到各人,当然越细化的工作计划就越精确,但mFone的项目几乎就没有足够的时间和人力来应付做计划带来的消耗,因此工作计划虽然从个人到小团队到项目都有做,但很少能持续,有的是用Project,有的是用Excel.

——————————————–

下面还有一些管理方法在项目中有需求触发过,但不够强,即使没有也能过,因此并没有产生真正的方法.

2. 沟通管理Communication Management

说明:从Mars项目到Dante项目,一个显著的变化就是分工更细化了,项目管理部/文档/UI/UX/系统部/应用部/QA等等,一个产品的完成被N多个部门细分了,由此带来了很多沟通问题,比如前期项目管理部对项目计划的制定与RD产生了冲突,前期测试部的测试计划与RD缺乏沟通等等,我想准确的讲沟通管理的问题我们并没有真正的方案尝试着解决,更多的可能还是依靠人与人之间的把握.

4. 事件管理Event Management

说明:这里的事件管理具体指什么,我要再看下PMBOK,不知道会议算不算事件管理,会议是项目中必然的事件,它的影响是可能打断与会者的工作,项目中的各种会议在组织/准备/通知/记录方面我们开始寻求怎样才能达到良好的效果,另一方面对于手机项目的各种测试(如CTA),这种即定下来的肯定会发生的算事件不?对于项目团队共公的或个人的需要处理的事件,也曾出现过使用论坛/网站等工具管理,但由于在事件管理方面需求强度不同,在mFone的团队中个人的会弱一些,而共公的可能需求不突出,往往只是通过邮件进行管理.

5. 人力资源管理Human Resource Management

说明:在项目中始终存在这个问题,尤其是一做就一年的项目,但人力资源管理涉及资源备份等方方面面,在技术团队中相对比较难做,没有真正的方案去尝试解决.

———————————————

呵呵,分的比较乱,还有一些实际上并不是在项目中被触发的,而是在项目总结中被发现的有需求的管理方法.

6. 项目定义Project Defintion

说明:UI/UX的需求比较大,他们开始认为项目定义影响着项目的需求定义,在项目总结阶段大家认为项目定义应该在与客户的前期沟通过程中由项目承接团队产生.(PS:如果这里的项目定义是指需求定义那种…就应该放到上面了,需求定义和变更管理不是一回事,13项里好像没有…去看完了PMBOK再说吧)

9. 风险管理Risk Management(对应PMBOK的风险管理)

说明:开始做项目时是不太care风险管理的,一切先做再说,做了遇到问题再说,项目的前期评估通常只是时间上和技术难度的简单评估,但到了Dante项目中不停出现的广泛意义上的风险时,大家开始想要重视对风险的评估和控制,比如第三方合作的风险,团队中人力的风险等等,再遇到类似的事情时会多考虑一下风险的问题,但整体的项目风险管理方法是在项目总结阶段才出现的,因此也借鉴了成熟的一些方法和经验.

11. 供应商(采购)管理Supplier Management

说明:需求不明显.

12. 技术环境管理Technical Environment Management

说明:需求不明显.

8. 赞助人协议管理Sponsor Agreement Management

说明:需求不明显.

Comments (18)

« Previous entries