一次坑爹的小bug。读取一段文字(编码utf-8),想替换掉空格,str_replace(”
“..)、preg_replace(“/\s/”..)都不起作用。

在c#里面把sql语句分行写:

替换空格,excel替换空格

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are
Happy.则经过替换之后的字符串为We%20Are%20Happy。

public class Solution {
    public String replaceSpace(StringBuffer str) {
        for(int k=0;k<str.length();k++)
        {
             char index=str.charAt(k);
             if(index==' ')
            {
                str.replace(k,k+1,"%20");                   
            }                
        }
          return str.toString();
    }     
}

 

以下是java.lang.StringBuilder.replace()方法的声明

public StringBuilder replace(int start, int end, String str)

替换空格,excel替换空格

 

<?php

// 替换<p>后4个空格
$str = file_get_contents("http://m.ts.cn/new/99cms_ts/api.php?s=/News/getNewsInfoTmp/Nid/51089");
$str = str_replace(" ", "-", $str);
$str = preg_replace("/\s/", "-", $str);
echo $str;  // 不起作用

图片 1  “select count(*) from users”
图片 2       + “where CAST(RTRIM(UserName) as VarBinary)=CAST(RTRIM(@user) as VarBinary)”
图片 3       + “and”
图片 4       + “CAST(RTRIM(PassWord) as VarBinary)=CAST(RTRIM(@pswd) as VarBinary)”;
图片 5

参数

  • start — 这是开始索引(包括)。

  • end — end 索引(不包括)。

  • str — 这是字符串,它将取代以前的内容。

String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)

 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String
是不可变的对象, 因此在每次对 String
类型进行改变的时候其实都等同于生成了一个新的 String
对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用
String
,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,
JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对
StringBuffer
对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用
StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下,
String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer
对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer
对象慢,而特别是以下的字符串对象生成中, String 效率是远要比
StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“
simple”).append(“ test”);
 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候
StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在
JVM 眼里,这个
 String S1 = “This is only a” + “ simple” + “test”; 其实就是:
 String S1 = “This is only a simple test”;
所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的
String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做
在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String
的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append
方法始终将这些字符添加到缓冲区的末端;而 insert
方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用
z.append(“le”) 会使字符串缓冲区包含“startle”,而 z.insert(4, “le”)
将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与
StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比
StringBuffer 要快。两者的方法基本相同。

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are
Happy.则经过替换之后的字符串为…

题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。

思路:我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。我们以字符串”We
are happy.”为例,”We are
happy.”这个字符串的长度是14(包括结尾符号’\0’),里面有两个空格,因此替换之后字符串的长度是18。

     
我们从字符串的后面开始复制和替换。首先准备两个指针,P1和P2。P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾(如图(a)所示)。接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。此时字符串包含如图(b)所示,灰色背景的区域是做了字符拷贝(移动)的区域。碰到第一个空格之后,把P1向前移动1格,在P2之前插入字符串”%20″。由于”%20″的长度为3,同时也要把P2向前移动3格如图(c)所示。

    
我们接着向前复制,直到碰到第二个空格(如图(d)所示)。和上一次一样,我们再把P1向前移动1格,并把P2向前移动3格插入”%20″(如图(e)所示)。此时P1和P2指向同一位置,表明所有空格都已经替换完毕

图片 6

 

 1 #include <string>
 2 #include "stdafx.h"
 3 
 4 void ReplaceBlank(char string[], int length)
 5 {
 6     if(string == NULL && length <= 0)
 7         return;
 8 
 9     int originalLength = 0;
10     int numberOfBlank = 0;
11     int i = 0;
12 
13     while(string[i] != '\0')
14     {
15         ++ originalLength;
16 
17         if(string[i] == ' ')
18             ++ numberOfBlank;
19 
20         ++ i;
21     }
22     
23     //newLength 为把空格替换为'%20'之后的长度 
24     int newLength = originalLength + numberOfBlank * 2;
25     if(newLength > length)
26         return;
27 
28     int indexOfOriginal = originalLength;
29     int indexOfNew = newLength;
30     
31     //若没有空格 直接跳过 
32     while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
33     {
34         if(string[indexOfOriginal] == ' ')
35         {
36             string[indexOfNew --] = '0';
37             string[indexOfNew --] = '2';
38             string[indexOfNew --] = '%';
39             //先使用再减一 
40         }
41         else
42         {
43             string[indexOfNew --] = string[indexOfOriginal];
44         }
45 
46         -- indexOfOriginal;
47     }
48 }
49 
50 int main()
51 {
52     const int length = 100;
53 
54     char string[length] = "We are happy";
55     printf("%s\n",string);
56     ReplaceBlank(string, length);
57     printf("%s\n",string);
58     
59     char string1[length] = " ";
60     printf("%s\n", string1);
61     ReplaceBlank(string1, length);
62     printf("%s\n", string1);
63     
64     return 0;
65 }

图片 7

 

题目:请实现一个函数,把字符串中的每个空格替换成%20。例如输入We are
happy.,则输出We%20are%20happy.。 思路:我们可…

// 函数名:ReplaceSpacialChar($C_char)

  没办法,将替换不了的空格ord()下才看到,这个utf-8空格比较特殊。ASCII
194 + 160出来的。

搞来搞去都有报错,MD,最后才发现连在一起后中间没有空格了(一位网友提示的),唉“`大脑不够用了啊!
图片 8图片 9图片 10图片 11图片 12图片 13图片 14图片 15图片 16图片 17图片 18图片 19图片 20图片 21图片 22图片 23图片 24图片 25图片 26图片 27图片 28图片 29图片 30图片 31图片 32图片 33图片 34图片 35图片 36图片 37图片 38图片 39图片 40图片 41图片 42

// 作 用:特殊字符替换函数

<?php

// 替换<p>后4个空格
$str = file_get_contents("http://m.ts.cn/new/99cms_ts/api.php?s=/News/getNewsInfoTmp/Nid/51089");
$str = str_replace(chr(194) . chr(160), "-", $str);  // 解决方法
echo $str;  // OK

// 参 数:$C_char(待替换的字符串)

  实验下这个空格。

// 返回值:字符串

<?php

// utf-8无bom文件下,四个空格
$s1 = chr(194) . chr(160);
$s2 = chr(32);
$s3 = " ";
$s4 = " ";  // 全角空格
$s = $s1 . $s2 . $s3 . $s4;

// 判断
$r  = '';
if ($s1 == $s2) $r .= 1;
if ($s1 == $s3) $r .= 2;
if ($s1 == $s4) $r .= 3;
if ($s2 == $s3) $r .= 4;
if ($s2 == $s4) $r .= 5;
if ($s3 == $s4) $r .= 6;

// 结果
echo $s, "#####", $r, "####", str_replace(" ", "-", $s), "####", preg_replace("/\s/", "-", $s);

// 备 注:这个函数有问题,需要测试才能使用

  结果:为方便书写,|代表空格,|代表全角空格。

//———————————————————————————–

  ||||####4####|–|####|–|

 代码如下

  改下浏览器编码为gbk,结果:聽
銆€#####4####聽–銆€####聽–銆€

function ReplaceSpecialChar($C_char)

 

{

  问题的根源,在于UTF-8这种编码里面,存在一个特殊的字符,其编码是“0xC2
0xA0”(194
160),转换成字符的时候,表现为一个空格,跟一般的半角空格(ASCII
0x20)一样,唯一的不同是它的宽度不会被压缩,因此比较多的被用于网页排版(如首行缩进之类)。而其他的编码方式如GB2312、Unicode之类并没有这样的字符。

$C_char=HTMLSpecialChars($C_char); //将特殊字元转成 HTML 格式。

  总结下来就是:替换不了的字符,打印出ASCII码来总能替换掉吧。

$C_char=nl2br($C_char); //将回车替换为

 

$C_char=str_replace(” “,” “,$C_char); //替换空格为

参考:解决采集UTF-8网页空格变成问号乱码  诡异的UTF8空格

return $C_char;

}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图