সি ++ (ইউনিকোড) এ কীভাবে std :: স্ট্রিংকে LPCWSTR এ রূপান্তর করবেন?


115

আমি std :: স্ট্রিংকে LPCWSTR এ রূপান্তর করার জন্য একটি পদ্ধতি বা একটি কোড স্নিপেট খুঁজছি


1
আমরা বিপরীতটি কীভাবে করব?
সোহাইব

আমি গুগল থেকে এসেছি বিপরীতে করার চেষ্টা করে। আপনি কোন পদ্ধতি খুঁজে পান নি?
টোমা জ্যাটো - মনিকা

উত্তর:


134

এমএসডিএন নিবন্ধটির লিঙ্কের জন্য ধন্যবাদ। আমি ঠিক এটিই খুঁজছিলাম।

std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

std::wstring stemp = s2ws(myString);
LPCWSTR result = stemp.c_str();

4
(এ প্রশ্নটি এলোমেলোভাবে ব্রাউজ করে পাওয়া গেছে; আমি সি ++ করেছি তার পরে অনেক দিন হয়েছে)) সুতরাং স্ট্যান্ডার্ড লাইব্রেরিতে স্ট্যান্ড :: স্ট্রিং -> স্টাড :: wstring রূপান্তর নেই? অদ্ভুত বলে মনে হয়; একটি ভাল কারণ আছে?
ডোমেনিক

5
আপনি যদি বুফের জন্য সঞ্চয়স্থান তৈরি করতে std :: vector <wchar_t> ব্যবহার করেন তবে কিছু যদি ব্যতিক্রম ছুঁড়ে ফেলে তবে আপনার অস্থায়ী বাফারটি মুক্তি পাবে।
জেসন হ্যারিসন

81
কারণ # 233 কেন সি ++ আমাকে নরকে ছাড়িয়েছে .. সাধারণ স্ট্রিং রূপান্তরকরণের জন্য কোডের 10 লাইন = /
b1nary.atr0phy

2
অথবা কেবল wstring ws (s.begin (), s.end ()) বলুন ...?
সিজেব্রু

3
@ সিজেব্রু: প্রতিটি সমস্যার জন্য একটি সমাধান রয়েছে, যা পরিষ্কার, মার্জিত এবং ভুল। ইতিমধ্যে আপনার ইনপুটটি ASCII ( এএনএসআই নয় ) অক্ষর ধারণ করে on
IInspectable

121

সমাধানটি অন্য যে কোনও প্রস্তাবের তুলনায় অনেক সহজ:

std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();

সর্বোপরি, এটি প্ল্যাটফর্মটি স্বাধীন। এইচ 2 এইচ :)


2
দুঃখিত বেনি কিন্তু এটি আমার পক্ষে কাজ করে না, টোরানের নিজস্ব সমাধানটি যদিও (তবে..বলিগ!) ভাল কাজ করছে বলে মনে হচ্ছে।
আইয়েন কলিন্স

32
এটি কেবলমাত্র যদি সমস্ত অক্ষর একক বাইট হয়, যেমন ASCII বা আইএসও -8859-1 হয় তবে এটি কাজ করে । মাল্টি-বাইটের যে কোনও কিছুই ইউটিএফ -8 সহ, খারাপভাবে ব্যর্থ হবে।
মার্ক মুক্তি পেতে

আমি বিশ্বাস করি আপনি প্রথম লাইনটি এখানে সহজ করতে পারবেন: std :: wstring স্টেম্প (s.begin (), s.end ()); এটি একটি সম্ভাব্য অনুলিপি মুছে ফেলবে এবং আরও সহজ দেখবে; নোট করুন যে সংকলকটি কোনওভাবে অনুলিপিটিকে মুছে ফেলতে পারে তবে এটি এখনও সহজ চেহারা।
কিট

13
প্রভু, সমস্ত উপকারের কি আছে? এই উত্তরটি কখনও কখনও একা কাকতালীয়ভাবে কাজ করে। এটি চরিত্রের এনকোডিংগুলিকে সম্পূর্ণ উপেক্ষা করে । আপনি কেবল একটি সংকীর্ণ চরিত্রকে প্রশস্ত করতে পারবেন না এবং আশা করছেন যে এটি যাদুকরভাবে একই কোড পয়েন্টটি উপস্থাপন করে একটি বিস্তৃত অক্ষরে রূপান্তরিত করবে। এটি a এর নৈতিক সমতুল্য reinterpret_castএই কোডটি কাজ করে না। ব্যবহার করবেন না.
IInspectable

2
@ এনিক: উইন্ডোজে charসাধারণত একটি এএনএসআই হিসাবে এনকোড থাকে। এএনএসআই এনকোডিং সহ, 128 থেকে 255 পর্যন্ত মানগুলি বর্তমানে সক্রিয় কোড পৃষ্ঠা ব্যবহার করে ব্যাখ্যা করা হয়। এই মানগুলিকে একটি wchar_t(উইন্ডোজে ইউটিএফ -16 এনকোডিং) এ সরিয়ে নেওয়া পছন্দসই ফলাফল তৈরি করবে না। আপনি যদি সুনির্দিষ্ট হতে চান, তবে এটি হ'ল 50% ক্ষেত্রে কাজ করে। ডিবিসিএস চরিত্রের এনকোডিং অ্যাকাউন্টে নেওয়া, সেই শতাংশ আরও কমে যায়।
IInspectable

9

আপনি যদি এটিএল / এমএফসি পরিবেশে থাকেন তবে আপনি এটিএল রূপান্তর ম্যাক্রো ব্যবহার করতে পারেন:

#include <atlbase.h>
#include <atlconv.h>

. . .

string myStr("My string");
CA2W unicodeStr(myStr);

তারপরে আপনি ইউনিকোডএসআরটি এলপিসিডব্লিউএসটি হিসাবে ব্যবহার করতে পারেন। ইউনিকোড স্ট্রিংয়ের জন্য মেমরিটি স্ট্যাকের উপর তৈরি করা হয় এবং পরে ইউনিকোডএসআরটি নির্বাহকের জন্য ডেস্ট্রাক্টর প্রকাশ করা হয়।


0

একটি std :: স্ট্রিং ব্যবহার না করে আপনি একটি std :: wstring ব্যবহার করতে পারেন।

সম্পাদনা: দুঃখিত, এটি আরও ব্যাখ্যামূলক নয়, তবে আমাকে চালাতে হবে।

Std :: wstring :: c_str () ব্যবহার করুন


9
প্রশ্ন: "আমার X থেকে Y তে রূপান্তর করা দরকার" " - এ: "এমন কোনও কাজের সন্ধান করুন, যেখানে তারা এক্সের পরিবর্তে এ ব্যবহার করছেন।" এটি অকেজো।
IInspectable

সব গাছের জন্য বন দেখতে পাচ্ছ না? এটি দরকারী, যেমনটি আমি যা খুঁজছিলাম ঠিক
চার্লি

-3
string  myMessage="helloworld";
int len;
int slength = (int)myMessage.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, 0, 0); 
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, buf, len);
std::wstring r(buf);
 std::wstring stemp = r.C_str();
LPCWSTR result = stemp.c_str();

-3

LPCWSTR lpcwName = std :: wstring (strname.begin (), strname.end ())। C_str ()


2
এই সমাধানটি 9 বছর আগে শীর্ষ উত্তরগুলির মধ্যে একটি দ্বারা ইতিমধ্যে প্রস্তাব করা হয়েছিল
নিনো ফিলিউ

1
9 বছর আগে এটি আজও ততটা ভুল। মন্তব্যগুলি ব্যাখ্যা করে, কেন এটি কেবল কোড ইউনিটের সংকীর্ণ পরিসরের জন্য কাজ করে।
IINspectable
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.