2016-03-04 9 views
5

मैं पर्ल 6 में ncurses int addwstr(const wchar_t *wstr); फ़ंक्शन का उपयोग करना चाहता हूं।मूल कॉलिंग इंटरफ़ेस: "wchar_t" का अनुवाद कैसे करें?

मैं एक पर्ल 6 हस्ताक्षर कैसे प्राप्त कर सकता हूं जो const wchar_t *wstraddwstr का संदेश देता है?

use v6; 
use NativeCall; 

constant LIB = 'libncursesw.so.5'; 

sub addwstr( ? ) returns int32 is native(LIB) is export {*}; 
+0

यदि मुझे गलत नहीं लगता है तो यह 'स्ट्रक्स एन्कोडेड' (utf32 ') लिनक्स पर होगा। – ElderBug

+0

एल्डरबग: यह मुझे देता है: "देशी कॉल के लिए अज्ञात स्ट्रिंग एन्कोडिंग: utf32 in ..." (लिनक्स पर)। –

+0

मैं वास्तव में एक पर्ल लड़का नहीं हूं इसलिए मुझे यकीन नहीं है। लिनक्स पर 'wchar_t' यूटीएफ -32 है। शायद यह 'यूटीएफ -32' 'के साथ काम करेगा? – ElderBug

उत्तर

2

wchar_t मेरी मशीन पर 32 बिट्स है। NativeCall doco से, आप उनमें से एक सरणी घोषित कर सकते हैं और सरणी नाम सूचक के रूप में कार्य करेगा;

#!/usr/bin/env perl6 
use v6; 
use NCurses;     # To get iniscr(), endwin() etc 
use NativeCall; 

# Need to run setlocale from the C library 
my int32 constant LC_ALL = 6;   # From locale.h 
my sub setlocale(int32, Str) returns Str is native(Str) { * } 

constant LIB = 'libncursesw.so.5'; 
sub addwstr(CArray[int32]) returns int32 is native(LIB) { * } 

# The smiley  : Codepoint 0x263a 
# Latin space  : Codepoint 0x20 (Ascii decimal ord 32) 
# Check mark (tick) : Codepoint 0x2713 

my CArray[int32] $wchar_str .= new(0x263a, 0x20, 0x2713); 

setlocale(LC_ALL, ""); 
initscr(); 
move(2,2); 
addwstr($wchar_str); 
nc_refresh; 
while getch() < 0 {}; 
endwin; 

यह प्रिंट मेरी मशीन पर "☺ ✓" है। यह सेटलोकेल के कॉल के बिना काम नहीं करता है। (संभवतः एन्कोडेड UTF-8) और यह सिर्फ काम करता है तो आप सिर्फ सामान्य perl6 तार पारित कर सकते हैं -

एक के रूप में अलग रूप में, आप 'w' कार्यों का उपयोग करने के लिए नहीं है। यह एक ही परिणाम पैदा करता है;

#!/usr/bin/env perl6 
use v6; 
use NCurses; 
use NativeCall; 

# Need to run setlocale from the standard C library 
my int32 constant LC_ALL = 6;   # From locale.h 
my sub setlocale(int32, Str) returns Str is native(Str) { * } 

my $ordinary_scalar = "☺ ✓"; 

setlocale(LC_ALL, ""); 
initscr(); 
move(2,2); 
addstr($ordinary_scalar); # No 'w' necessary 
nc_refresh; 
while getch() < 0 {}; 
endwin; 
संबंधित मुद्दे