sbf胜博发娱乐微信公众平台设计网页提交表单到 后台处理。

( sbf胜博发娱乐 )

我在做一个基于微信的申请平台,在表单提交这卡住了,表单中有文字,图片信息,我要怎么才能拿到这些信息然后存到自己的数据库中呢?

呃你没做过web吧?文件图像一般先上传,获得文件名或URL,然后直接ajax把form和这个URL一起post不就完了??

(看完/读完)这篇文章有何感想! sbf胜博发娱乐的分享…

胜博发娱乐平台注册登录官方网址java.util.List 类中的 get set 方法为什么没有可能抛出异常提示

( 胜博发娱乐平台注册登录官方网址 )

通常一个方法如果有可能抛出异常,那么 IDE 会提示添加 throw ,然后上层函数就知道了。
但是为什么 java.util.List 类中的 get set 方法可以这么写,而没有提示。

编译期不会要求捕捉运行时异常,也就是说 RuntimeExceptin 及其子类都是不强制要求捕捉的。
看看 IndexOutOfBoundsExcepton 的继承树:

java.lang.Object
    java.lang.Throwable
        java.lang.Exception
            java.lang.RuntimeException
                java.lang.IndexOutOfBoundsException

(看完/读完)这篇文章有何感想! 胜博发娱乐平台注册登录官方网址的分享…

胜博发娱乐平台注册登录官方网址java无法找到或加载主类?

( 胜博发娱乐平台注册登录官方网址 )

public class hello{
    public static void main(String[] args){
        System.out.println("Hello world");
        }
 }

代码很简单,就是这个,也没有用到任何其他的包.不过
java hello
提示无法找到加载主类,如上图.我的类路径和JAVA_HOME CLASSPATH如上.
文件权限也都是默认当前用户.
各位看官?这是为何?
还有个特点,我在mark用户下会出现这个问题,不过hadoop用户下 完全没有问题.

$CLASSPATH 没有当前路径吗?这个应该是不对吧。

找不到或者加载不了主类就是classes目录下的hello.class不存在或者说java类名与文件名不一致。或者没有执行权限.

尝试加上 cp 参数为当前路径试试:

java -cp . hello

是不是当前用户没有这个文件的读取权限?

(看完/读完)这篇文章有何感想! 胜博发娱乐平台注册登录官方网址的分享…

www.sbf999.comspringmvc 转发之后,不能访问图片路径了

( www.sbf999.com )

springmvc controller转发到jsp之后,访问图片的路径变了,加上了controller类的RequestMapping参数的值。
请问这是什么原因?

看了评论你贴的代码。你jsp中访问那张图片用的是相对路径吧

<img src="YHChannelApply/001.jpg" />

你网站默认路径是main目录下,所以图片url相对路径就是/hrMs/main/YHChannelApply/001.jpg

然后controller跳转后到了/people/getPeopleList图片url对应就成了/hrMS/people/YHChannelApply/001.jpg

在WebContent下建立一个resources目录,把图片放进resources/img。jsp中用

<img src="${ctx}/resources/img/YHChannelApply/001.jpg" />

ctx是用jstl设置的值就是项目路径,一般放在jsp顶部

<c:set var="ctx" value="${pageContext.request.contextPath}"/>

(看完/读完)这篇文章有何感想! www.sbf999.com的分享…

胜博发娱乐平台注册登录官方网址java为什么明明知道这句话不会被执行,但为什么却一定要加上这句话。

( 胜博发娱乐平台注册登录官方网址 )

这是翻转链表的一段程序,明明这段程序中函数的return一定会是循环体中的if语句中结束,然后return,根本都不会执行到正常结束循环,然后执行最后一句return语句。但是似乎最后一句return语句还必须加上,。java为什么要设计成这样?

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null) return null;

        ListNode pre = null;
        ListNode curr = head;
        while(curr != null){
            if (curr.next == null){
                curr.next = pre;
                return curr;
            } 
            ListNode next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return curr;
    }
}

但是下面这段程序却又不用最后加上一句return语句,而且加上最后一句return反而会报错。说是最后一句语句无法执行不到。java的编译器倒是怎么搞的。

public class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null) return null;
        ListNode pre = null;
        ListNode curr = head;
        while(true){
            if (curr.next == null){
                curr.next = pre;
                return curr;
            } 
            ListNode next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return curr;  // 加上最后这句话会报错。
    }
}

先说第二个:

编译时报错的消息为: 不可能到达的语句块.
原因是因为 while 中 的条件为 true, 即这个循环会一直进行下去(因为没有检测到break可以中断while让流程往下走下去, 所以whlie后面的语句就变成永远不可能被执行到的了).

再说第一个:

报错的原因为: 缺少return语句.
依据为: while 中的条件可以为假(导致while结束), 而这个函数声明的返回值为 ListNode, 但while结束之后没有返回值, 所以报错.

PS:编译器还没有聪明到可以像人一样(或者说还没有实现), 根据你的代码来决定while循环的可能性, 它只是简单的根据使用while时给定的条件来进行编译.

原因很简单,因为对于第一个:其中的curr这个值是有可能是null的,因为在初始化ListNode的时候可能会由于各种问题而内存不能申请成功(比如此时没有可用的内存了),所以这个while是有可能会退出的,也就有可能会执行到后面去,所以必须要有return

而第二个:你已经显示的指明了while中的值是true,所以,显然不可能会执行到后面

还有一种解释就是这个是与你的编译器有关,while(true)是编译器能检测到的范围,而while(curr != null)是不能在编译阶段检测出来的,也就是编译器并不能判断是不是会执行到最后。。

(看完/读完)这篇文章有何感想! 胜博发娱乐平台注册登录官方网址的分享…

胜博发娱乐平台注册登录官方网址Hibernate未调用update自动提交

( 胜博发娱乐平台注册登录官方网址 )

场景时在SSH2下的Service层。

某service中

java...
// 查询事件模板
CommonEvent event = commonEventDao.find(code);

// 模版内容是"${name}登录"
String template = event.getTemplate();

template = template.replaceAll("\\$\\{name\\}", "admin");
event.setTemplate(template);

// 其他service的调用
...

上边DAO的查询:

javapublic CommonEvent find(String code) {
    return (CommonEvent) sessionFactory0.getCurrentSession().get(CommonEvent.class, code);
}

然后service结束后,数据库中的event纪录中的template字段从 ${name}登录 变成了 admin登录,原因在哪里呢?

如果在find查询时使用session.evict(event)将该对象逐出,则不会有脏写的问题。

如果不使用evict方法该怎么处理?

new一个CommonEvent类型的对象event2,把event的属性值copy一份过来,repalceAll后的内容放到event2里去。应该是当前的逻辑代码中,event还是持久态,所以最后提交事务后,把event的内容也更新到数据库了。

(看完/读完)这篇文章有何感想! 胜博发娱乐平台注册登录官方网址的分享…

sbf胜博发娱乐请问,VLC player、jwPlayer、ckPlayer它们的差别在哪?

( sbf胜博发娱乐 )

哪位大神,帮帮我。
帮我分析比较一下上面3款播放器。
刚入门,要学的东西好多。

vlcPlayer是客户端播放器。JwPlayer跟ckPlayer都是网页播放器。

vlc支持几乎所有视频格式,和快播一样,也可以像快播一样嵌入网页播放(需要已经安装客户端)。
jw支持html5和flash支持的视频格式,只能在网页上播放。
这两个都支持flash的直播协议(rtmp?)和html5的直播(hls?)
最后一个没听说过。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐的分享…

sbf胜博发娱乐关于Object中的equals方法和String中的equals方法的疑惑?

( sbf胜博发娱乐 )

首先是这段代码:

public class test {
    public static void main(String[] args) {
        String s1 = "Monday";
        String s2 = new String("Monday");
        if (s1 == s2){
            System.out.println("s1 == s2");}
        else{
            System.out.println("s1 != s2");
        }
        if (s1.equals(s2)) {
            System.out.println("s1 equals s2");
        }else{
            System.out.println("s1 not equals s2");
        }
    }
}

输出结果是:s1 != s2 和 s1 equals s2; 这个我可以理解,使用new操作符后,在堆内存中又新开辟了一块空间,s1和s2在堆内存中的值相同,但是引用的地址不同。但是在博客园的这篇文章看到下面这段代码:

public class test{
    public static void main(String[] args)
    {
        test obj1 = new test();
        test obj2 = new test();

        if(obj1 == obj2){
            System.out.println("obj1 == obj2");
        }else{
            System.out.println("obj1 != obj2");
        }
        if(obj1.equals(obj2)){
            System.out.println("obj1 equals obj2");
        }else{
            System.out.println("obj1 not equals obj2");
        }
    }
}

输出: obj1 != obj2 obj1 not equals obj2
昨天晚上看了那篇文章的评论,把我自己的理解写出来,但是还是不是很清楚,我大意是这样的:
java当中所有类都继承自Object这个基类,在Object中的定义了一个equals方法,这个方法的初始化行为是比较对象的内存地址值(Object的equals方法使用==比较的),但在一些类库中这个方法被覆盖掉了,比如String, Interger, Date这些类中equals有其自己的实现方法,String类继承自Object类,也继承了equals方法,但是重写了该方法,不再比较类在堆内存中的存放地址了,而是比较存在堆中的值。 ???
这个解释不知道对不对,望指教,还有,关于obj1 not equals obj2你们是怎么看的??

== 比较就不用说了,任何情况下都是比较内存地址。
equals比较,是一个方法调用,默认的实现(Object类)是使用了==

public boolean equals(Object obj) {
    return (this == obj);
}

第一段代码:
比较的是String对象,而String类覆写了equals()方法,比较的是字符串内容,所以输出了s1 equals s2

这个你理解的没有问题!

第二段代码:
比较的是test对象,test类没有覆写equals()方法,所以还是默认比较内存地址,从而输出了obj1 not equals obj2

在下以为应该先抛开代码实现,直接看 equals 方法存在的意义———对比对象与对象是否相同。
那么问题来了,对象与对象怎样才算相同呢? 这个就该由对象所属的类的作者来决定了,也只有他才能决定其创造的类的实例应该如何对比相同。

String的作者是谁不知道,但你也赞同他的 equals 实现吧?字符串对比字符串,就该对比字符序列是否相同。

至于 test ,它的作者是题主你,而你没有定义该如何对比test对象,但却调用了 equals 想要对比它。此时会有个什么结果? 只能是 test 这个类的父类的 equals 结果呗,默认的父类是 Object 类,@ch_gilbert 已经说明了~

equals 取决于具体的实现

public class A{ 
    private String color;
    private int weight;
     public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public boolean equals(Object obj){
            if (obj == null)
                return false;
          if (this == obj)
                return true;
            if (getClass() != obj.getClass())
                return false;
            A other = (A) obj;
            if (color == null) {
                if (other.color != null)
                    return false;
            } else if (!color.equals(other.color))
                return false;
            if (weight != other.weight)
                return false;
            return true;
    }

}

你说的真复杂,好歹是看完了,应该是正确的理解
我贴一下Stirng.equals方法的源码,很明显。

 public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }

==的比较,你可以理解,equals说白了不就是个方法么?具体怎么实现的就是怎样的结果,这何必纠结呢?
假设equals这么写

怎么样,==不同,就看如果是“111111”才返回true。

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            if (anotherString.equals("111111")) {
                return true;
            }
        }
        return false;
    }

这么说明白了吗?equals这东西只是一个方法而已!因为Object里面有,其他的Class都继承它,所以看上去特殊点。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐的分享…

sbf胜博发娱乐mac 下基于 java 调用 adb 命令遇到问题

( sbf胜博发娱乐 )

近期在做一个程序,需要用到 adb 命令,在 mac 下基于 java 执行 adb 命令,遇到无法正常执行的情况。 报错如下:

java.io.IOException: Cannot run program "adb": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
    at java.lang.Runtime.exec(Runtime.java:617)
    at java.lang.Runtime.exec(Runtime.java:450)
    at java.lang.Runtime.exec(Runtime.java:347)
    at main.execAdb(main.java:14)
    at main.main(main.java:40)

PS: adb 的环境变量什么的都是正常配置好的,因为在终端正常执行 adb 相关命令。 现在是希望 java 里面也可以调用,请大侠们支招。谢谢~

这个和权限没有什么关系,主要是java虚拟机加载的时候没有adb相关的环境变量,如果使用的是ProcessBuilder去执行adb的命令,建议在设定命令的参数里面使用全路径。比如:

ProcessBuilder pb = new ProcessBuilder("/Users/David/Applications/android-sdk-macosx/platform-tools/adb", "version");

已经试过了,pass

在应用中调用adb命令需要获取root权限吧

(看完/读完)这篇文章有何感想! sbf胜博发娱乐的分享…

胜博发娱乐平台注册登录官方网址单点登录问题

( 胜博发娱乐平台注册登录官方网址 )

公司要搭建统一用户平台,要使用单点登陆功能,各平台用户怎么整合去实现单点登陆,毕竟每个平台的用户信息不完全一致,我怎么保证同一个用户的不同系统帐号去登陆一个实现全平台登陆?

  1. 登录app1或者app2时自动跳转到auth.com进行登录

  2. 验证成功后auth.com通知app1.com和app2.com, 将登录成功的session保存到数据库中

  3. 通过当iframe来获取app1和app2的cookie(通过url中的session来匹配用户)
<iframe width="0" height="0" src="https://app1.com/sso.php?session=111111111111111111"></iframe>
<iframe width="0" height="0" src="https://app2.com/sso.php?session=111111111111111111"></iframe>

4 . 这样在所有的页面中都成功登录了

同一个域名实现起来就比较简单
比如,单点登录的域名为sso.xx.com
业务域名为job1.xx.com
大概就是显示出sso单点登录的界面,然后执行登录,在.xx.com的域下,写入登录uid。
然后在在job1.xx.com里面查询有没有uid这个cookie, 有就代表登录,没有就代表没登陆。
用户的其他附加信息,可以在job1.xx.com里面自行补全。。

如果域名不一样,请参考php的ucenter的实现方式。

单点登录的原理查一查就能明白了,本质就是浏览器验证过了,所以可以进入接受单点登录结果的系统。

假设浏览器在a.com验证过了,并生成了session信息。
1. 当用户登录b.com的时候,发现用户没有登录,那么redirect到a.com
2. a.com后台程序收到请求发现这个浏览器有session信息,并redirect到b.com?ticket=xxx
3. b.com的后才接收到这个带ticket的请求以后,通过后台程序发出一个请求到a.com,询问a.com这个ticket是不是有效的
4. a.com说有效,那么b.com响应b.com?ticket=xxx这个请求并允许用户登录,ticket无效则引导至a.com的登录画面。

以上是一个能够跨域的单点登录过程

cas…

(看完/读完)这篇文章有何感想! 胜博发娱乐平台注册登录官方网址的分享…

sbf胜博发娱乐【疑问】求教一个关于js执行顺序的问题就大家帮忙看下??

( sbf胜博发娱乐 )

我先说下,我的需求,进到页面的时候先检测Id是否为空,如果为空就跳转到主页面!

我一开始时这么写的

但是这样写完会报一个错误

然后我将代码换了一下位置

这样就没问题了,求问这是为什么呢?

你应该在跳转的时候终止逻辑继续执行

$(function(){
    if(!pageCheck()) {
        return  false
    }
    // 其他代码
})

你的第三张图的return false是终止执行了$(function(){})这个逻辑
而你的第一张图的return false仅仅是终止pageCheck这个函数

不知道为什么我这里看不到第一、三张图,第二张图那个错误信息看到了,虽然不能确定是什么原因,不过我有个建议:
你使用控制台按照调用栈找到出现错误的代码,并且查看每个调用栈下各个变量的情况,看看是哪里出现问题了。
代码顺序改变程序就正常了,而且出现TypeError,可能是因为按原来的顺序会有变量undefined。

第二段代码
在先检测Id非空时执行,

return false;

getCourseByTeacherId_easyuiInit();

方法没有被执行

第一段代码

getCourseByTeacherId_easyuiInit();

方法一定被执行

你看下getCourseByTeacherId_easyuiInit这个函数是不是有问题~~~~~~~~~

(看完/读完)这篇文章有何感想! sbf胜博发娱乐的分享…

sbf胜博发娱乐Java数据类型问题

( sbf胜博发娱乐 )

将long类型的最大值复制给一个long变量为什么会报错:The literal 9223372036854775807 of type int is out of range。int类型就没事。

        int b = 2147483647;//编译通过
        long c = 9223372036854775807;//编译出错
        System.out.println(Integer.MAX_VALUE);//打印出2147483647
        System.out.println(Long.MAX_VALUE);//打印出9223372036854775807

long c = 9223372036854775807L; 这样就不会出错了。

long 型字面量需要加 Ll 后缀标识。没有标识会被当作整型字面量,所以受 int 范围限制。

这里第二句的编译出错是因为 9223372036854775807这个数超出了 默认类型(int类型)的最大值范围。
long c = 9223372036854775807; //编译器在编译这句是实际是按下面的过程处理的。

- 首先将数值9223372036854775807 赋值给默认类型(int类型)  <- 这里会导致编译不通过
- 然后将这个默认类型的对象赋值给 c

正确的写法可以修改为下面的方式

long c = Long.valueOf("9223372036854775807");

或者

long c = Long.MAX_VALUE;

(看完/读完)这篇文章有何感想! sbf胜博发娱乐的分享…

胜博发娱乐平台注册登录官方网址类中有private变量,怎么重新设计这个类才能做到可以新增成员变量,但不用改代码。

( 胜博发娱乐平台注册登录官方网址 )

如果重新设计这个类,怎么才能做到可以新增成员变量,但不用改代码。

public class Contact{

     private String name;
     private String tel;

     ····
 } 

那你只有继承了……

一般来说,写一个父类,去继承子类。然后再实例化类。

可以新增一个map成员变量,在map中添加变量,如name,就加一个name的键值对。

(看完/读完)这篇文章有何感想! 胜博发娱乐平台注册登录官方网址的分享…

胜博发娱乐平台注册登录官方网址【SOS】nginx无法解析php文件?

( 胜博发娱乐平台注册登录官方网址 )

已经在服务器上装了nginx和php,php-fpm(监听9000端口)
可以正常显示html,但是每当输入url打开一个php时,无法正常解析,导致变成下载模式

nginx.conf如下

现在打开php直接变成404…Orz

干脆贴出来吧,估计是这一段的问题,搞了好久都没进展….

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
}

这样写试一下 用nginx -t命令检查你的nginx配置文件是否有错误
location /index.php {

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;

}

我以前也有过,当时是centos6,后来换成7了。
之后绑定好域名就好了

还能显示nginx的画面
问题是我用域名安装源码怎么就显示404
用ip安装弹出php文件的下载,php我也运行了啊。
网站默认主目录我也已经定位到www.38934.tech上面了。
苦恼啊!
2016-10-26 09:33:34
管理员
请您确保以下3个设置:

  1. 域名解析到服务器IP

  2. Nginx网站管理里有配置这个域名

  3. 修改完配置后有重载或重启Nginx
    目前已为你修正配置。

第一步 nginx.conf的配置

location / {
        if (!-e $request_filename) {
             rewrite  ^/(.*)$  /index.php/$1  last;
             break;
        }
    }

    location ~ ^/s-([0-9a-z]+)-(.*) {
        rewrite ^/s-([0-9a-z]+)-(.*) /shtmls/$1/$2 last;
        break;
    }

    location ~ .+\.php($|/) {
        set $script    $uri;
        set $path_info  "/";
        if ($uri ~ "^(.+\.php)(/.+)") {
              set $script     $1;
              set $path_info  $2;
        }

        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param SCRIPT_FILENAME  $document_root/$script;
        fastcgi_param SCRIPT_NAME $script;

    }

第二步 sudo vim /etc/php5/fpm/pool.d/www.conf
将 ;listen = /var/run/php5-fpm.sock
改成 listen = 127.0.0.1:9000

你的代码直接放在/root里么?你改过之后的完成配置也发一下吧。

(看完/读完)这篇文章有何感想! 胜博发娱乐平台注册登录官方网址的分享…

胜博发娱乐平台注册登录官方网址如何在自己的项目中实现word在线编辑

( 胜博发娱乐平台注册登录官方网址 )

希望能在自己(公司)的项目中实现word在线编辑,感觉无从下手

(不好意思,没说清楚,我补充一下:比如我上传了一份word,然后能在线编辑这个word文件,编辑之后能保存)

谢邀~
富文本编辑器
http://summernote.org/

你可以使用百度的ueditor
http://ueditor.baidu.com/webs…

如果不考虑富文本编辑器的话,硬要实现office系列的在线编辑。

你大概有以下几条路走:
1、只考虑IE,用专有ActiveX插件,实现浏览器里面编辑office文档。https://github.com/stone0090/…
2、现代浏览器,接入在线的office online 。

不要说在线 Word 编辑,就是在线 Word 阅读都已经很不容易了,这个功能太专业了。

网上能搜到一些阅读组件,大部分是收费的,比如永中的高清服务器版本收费大概是80K。

另外,你可以去看看 Open Office 有没有提供相关的组件。Open Office 一直是开源的 Office 解决方案。

(看完/读完)这篇文章有何感想! 胜博发娱乐平台注册登录官方网址的分享…

www.sbf999.comphp中的字符编码

( www.sbf999.com )

$str1 = "\xe4\xb8\xad";

$str2 = '\xe4\xb8\xad';

$str3 = '中';

能否详细解释一下三者的区别,是否可以相互转化

第一次在segmentfault上回答问题。。

PHP字符串变量,双引号和单引号的意义是不同的

使用双引号时会转义 单引号时不转义
使用双引号时,$xxxx文本会被相应变量的值替换,单引号没有这个效果

Eg.

$abc='123';
echo "$abc"; //这样会输出123
echo '$abc'; //这样会输出$abc
echo "\n"; //这样会输出一个换行符
echo '\n'; //这样会输出\n两个字符(一个斜杠一个n)

回到问题,
“中”这个汉字在UTF-8的16进制编码是0xe4,0xb8,0xad
因此在双引号字符串中,会被转义为 “中” x开头表示这是一个以十六进制表达的字符,就和HTML中&xe4; 一样
单引号字符串中,直接输出xe4xb8xad

如果你的环境编码是在UTF-8下面, str1和str3等价, 如果直接echo, 都会输出”中”, 如果是二进制层面三个字节比较, 也是完全相等, PHP中的字符串就是直接本地编码二进制存储的

如果你的环境编码是非UTF-8(例如GBK), str1基本上是个乱码, str1和str3也不再等价

至于str2, 它无论什么时候都会输出 ‘\xe4\xb8\xad’ (不含引号, 在单引号的字符串中, 只有单引号本身需要转义成\’, 其它情况的\都视为普通字符处理

只解释第一个与第二个的区别,也就是单引号与双引号的区别

双引号:引号内部会被转义
单引号:引号内部不会被转义

$a = 123;

echo "output:$a";//output:123
echo 'output:$a';//output:$a

//下面的示例仅限linux的php-cli
echo "new line\nsecond line";
/*
会换行,输出:
new line
second line
*/

echo 'no new line\n aaa';
/*
不会换行,输出:
no new line\n aaa
*/

\x后跟着十六进制数字的属于转义字符,转义字符只有在双引号"中才起作用。单引号中只有对单引号本身'和反斜杠\的转义有效,其他的都无效。

PHP本身不区分字符编码。也就是说,$str1是一个三字节的字符串,字符串的三个字节分别是(十六进制编码)E4 B8 AD。如果在UTF-8编码中,就是字。其他编码中就不一定了。

$str2则是一个12字节的字符串,就是你输入的那些字符。

$str3则是一个字符串,如果你把文件以UTF-8编码保存,那就和$str1是一样。如果你以GBK保存,那就是两个字节的D6 D0,如果你以BIG5保存,就是A4 A4


不管是UTF-8、GBK还是BIG5,甚至于很多其他的语言编码,都是遵循EUC的,也就是说对于ASCII字符,他们的编码都是一致的,所以无论用哪种编码保存,对PHP的代码工作都不会有影响。但是对于非ASCII字符就有很大的区别。

所以PHP中的非ASCII字符要正常显示,就要保证你的保存编码和输出编码是一致的。如果是输出的是HTML,是通过meta标签或者在HTTP Header中声明编码的。如果不一致,那就会出现乱码了。

(看完/读完)这篇文章有何感想! www.sbf999.com的分享…