2011-06-06 138 views
3

我有這個問題,如果我有:問題ord()和字符串

mychr ='';

其中mychr equival到#255中的 '空間'(手動鍵入ALT + 255),以及i寫:

myord = ORD(mychr)

到myord返回值160,而不是255。當然,同樣的問題也是與特性ALT + 254等 正如我可以解決這個問題?我已經在控制檯模式下對delphi xe進行了測試。

注意:如果我使用:

mychar =#255;

然後正常工作ORD()的返回值。

回答

8

我認爲問題在於Windows Alt + Num快捷方式根據本地代碼頁插入字符,而現代Delphi使用Unicode字符,這些不同(除非值小於或等於127,我認爲) 。解決方案是在代碼中明確輸入值#255。此外,它是一個非常不好的習慣在代碼中包含'不可見'特殊字符,因爲如果不將其複製到外部工具中,它就不能分辨出它是什麼字符!另外,您將不得不信任.pas文件的文本編碼。這是最好使用常量像#255。更好的是,

const 
    MY_PRECIOUS_VALUE = #255; 

並在每次需要時使用此常數。

更新

據對Alt code的英文維基百科的文章:

如果鍵入的數字有一個前導0 (零),所使用的字符集是 Windows代碼頁匹配當前輸入區域設置的 。對於大多數使用拉丁字母的系統 ,這是Windows-1252的 。有關完整列表,請參閱 代碼頁。如果這個數字沒有 前導0(零),DOS兼容 被調用。使用的字符集是 當前的 輸入區域設置的DOS代碼頁。對於使用 英文系統,這是代碼頁437.對於 使用拉丁語字母 多數其他系統,這是代碼頁850對於 完整列表,請參閱代碼頁。

因此,如果您確實想要繼續輸入Alt鍵碼,則最好輸入Alt和0255並且前導零。

+1

+1 for my_precious .... – RBA 2011-06-06 12:24:25

+1

@Andriy M:你是完全正確的。當然,我正在考慮用前面的零輸入* Alt + 0225。 – 2011-07-02 20:31:52

3

如果鍵入ALT+255,DOS代碼頁使用;對於437和850 DOS代碼頁(其中一個可能使用)#255是NBSP(非破壞空間)。在Unicode中,NBSP是$ A0(160)。這就解釋了爲什麼你獲得奧德160

1

AFAIK控制檯模式下使用OEM的Ansi字符集。在Delphi XE下,你不是在Ansi世界,而是在UCS-2/Unicode世界。

var MyChar: char; 
    MyWideChar: WideChar; 
    MyAnsiChar: AnsiChar; 
begin 
    MyChar := #255; 
    MyWideChar := #255; 
    MyAnsiChar := #255; 

前兩個變量是相同的,即具有Unicode代碼255 = $ 00FF的字符,因爲在Delphi XE,char = WideChar。對於第一個Unicode頁面,請參見this article

但是MyAnsiChar是在從當前代碼頁轉換到OEM控制檯代碼頁後在控制檯上顯示的內容。

在Unicode圖表,這$ 00FF是微不足道的y隨山黃麻:

U+00FF ÿ Latin Small Letter Y with diaeresis 

的控制檯內,您將使用OEM char set, i.e. Code Page 347。所以你的情況$ FF不是人物,而是一個特殊的代碼

FF NBSP Non Breaking SPace 

轉換時回爲Unicode將其轉化爲U + 00A0:

U+00A0 NBSP Non Breaking SPace 

這是非常有可能,你是在一個Windows-1252 code page,因此通常德爾福XE AnsiString類型將地圖#255到微不足道的y隨山黃麻:

FF ÿ Latin Small Letter Y with diaeresis 

可以使用低級別的如CharToOemBuff Windows函數來執行轉換或從OEM,或使用OEM AnsiString類型類型:

type 
    TOemString = AnsiString(437); 

在所有情況下,控制檯是不是現代的Windows下的進入加劇了文本的最佳方式,和Unicode德爾福XE。

使用InputQuery函數例如應該更安全,因爲它會返回一個Unicode string變量。 ;)

+0

你好,我嘗試解釋更好的我的問題。例如,我有: x:=''; for i:= 0 to 255 do x:= x + chr(i); for i:= 0 to 255 do writeln(ord(x [i])); 簡單地說,我想在第二個循環中執行該操作(x [i]),將我的所有值從0恢復爲255,正如我在第一個循環中用chr設置的那樣。 我已經理解這個問題是關於字符集的,但我問我可以解決它。 我需要解決它,因爲有可能正確寫一個與文件和字符串讀取時間的字符串的所有單個字符。 再次感謝您的幫助。 – Danny 2011-06-07 09:30:10