Виявити 64-розрядну або 32-розрядну Windows за допомогою User Agent або Javascript?


80

Я хочу запропонувати правильну версію завантаження. У мене є такі версії:

  • 32-розрядна Windows
  • 64-розрядна Windows
  • Linux

Виявити Linux за допомогою поля User Agent дуже просто; але чи можна надійно з’ясувати, чи є Windows 32-розрядною чи 64-розрядною?

Користувачі можуть використовувати дивні браузери - IE та Firefox є загальними, і ми, мабуть, десь маємо користувача Opera; можливо, користувач Chrome теж. Я знаю, що 64-розрядна Windows 7 постачається з 32-розрядною та 64-розрядною версіями IE, і я хотів би надіслати їм обидві 64-розрядні версії мого завантаження.

(Відредаговано, щоб додати: я знаю, що повинен надати всі варіанти, і буду. Але люди не читають їх . Тому я хотів забезпечити правильне завантаження за замовчуванням, щоб покращити зручність використання. Звичайно, хоча це корисно якщо я правильно зрозумію, це надзвичайно не корисно, якщо я помиляюся. І з відповідей на цей момент, схоже, немає надійного способу зробити це).


1
Дивно, що ваша версія Linux працює на x86, x64 та ARM.
MSalters

9
"Версія Linux" є вихідним кодом. Версії Windows є двійковими.
user9876

Відповіді:


53

Спробуйте це, шукає WOW64 (32-біт на 64-біті) або Win64 (власний 64-біт) у рядку агента користувача.

    if (navigator.userAgent.indexOf("WOW64") != -1 || 
        navigator.userAgent.indexOf("Win64") != -1 ){
       alert("This is a 64 bit OS");
    } else {
       alert("Not a 64 bit OS");
    }


5
Це працює добре, за винятком Safari на 64-розрядному Windows 7, якому бракує WOW64, не вистачає Win64 і повідомляється window.navigator.platformяк win32. Я спробував у Safari 4 / Win; пізніші версії можуть змінюватися.
Will Martin

2
Не на 100% точний, але це хороший підказка, оскільки немає кращого способу надійно його виявити.
Vitim.us

39

Я провів кілька тестів. Ось результати, сподіваюся, це допоможе:

64-розрядна MacOS + 64-розрядна версія Safari або 32-розрядна версія Chrome:
window.navigator.platform = MacIntel

32-розрядні вікна + сафарі:
window.navigator.platform = Win32

64-розрядна Windows + 64-розрядна IE:
window.navigator.platform = Win64
window.navigator.cpuClass = x64

64-розрядна Windows + 32-розрядна IE:
window.navigator.platform = Win32
window.navigator.cpuClass = x86

64-розрядна версія Windows + 32 Firefox (або Chrome):
window.navigator.platform = Win32

32-розрядна Linux Mint (i686) + Firefox:
window.navigator.platform = Linux i686

64-розрядна версія Ubuntu (x86_64) + 32-розрядна версія Chrome:
window.navigator.platform = Linux i686

64-розрядна Ubuntu + 64-розрядна Богоявлення:
window.navigator.platform = Linux x86_64

Поки що я використовував цей код:

deployJava.isWin64OS = function() {
    return navigator.userAgent.indexOf('WOW64')>-1 || window.navigator.platform=='Win64';
};

1
Це не точно. 64-розрядна версія Windows із 64-розрядною версією Chrome також дає "Win32".
Аполлон,

31

Проаналізувавши близько 14000 унікальних користувацьких агентів ( звідси ), я придумав наступні рядки для пошуку:

  • x86_64
  • x86-64
  • Win64
  • x64; (Майте на увазі крапку з комою! Без неї у вас будуть помилкові спрацьовування.)
  • amd64
  • AMD64
  • WOW64
  • x64_64

Крім того, хоча вони мають різні набори інструкцій і не сумісні з Intel x86_64, можливо, ви захочете виявити наступне:

  • ia64
  • sparc64
  • ppc64
  • IRIX64

Остерігайтеся, не шукайте просто щось, що містить "64" або навіть "x64". Номери збірки Chrome, павуки / боти, бібліотеки, версії .NET, роздільна здатність тощо можуть також містити рядок "x64", будучи 32-бітовою (або іншою) ОС.

Зверніть увагу, що ви можете шукати всі ці рядки без урахування регістру.

Мені не вдалося знайти нічого на ARM. Можливо, хтось інший? Будь ласка, відредагуйте, це вікі спільноти.


Я тестую проти RegExp `/ \ barm / i у рядку UA. Межа слова перед "arm" важлива, інакше вона також відповідала б рядку UA для Ubuntu 9.10 (Karmic Koala). Я побудував цей шаблон на основі деяких рядків UA на useragentstring.com/pages/All та code.google.com/p/google-web-toolkit/issues/detail?id=8038
Роб W

24

Ви можете перевірити window.navigator.platformі window.navigator.cpuClass.

Я не впевнений у вашій ситуації, але я б подумав просто зробити те, що робить більшість інших сайтів, і дозволити користувачеві вибрати, яке завантаження він отримає. Вони можуть завантажувати його на іншу машину, покласти на флеш-пристрій або просто захотіти, щоб 32-розрядна версія працювала на їх 64-розрядному вікні. Якою б не була причина, я волів би мати вибір.


6
Там, де я працюю, у нас були всі варіанти завантаження доступні протягом тривалого часу, але користувачі часто роблять помилку, завантажуючи неправильну версію для своєї системи.
exupero

1
Більшість користувачів просто вибирають першого, коли не впевнені. Коли ви хочете дати рекомендацію користувачеві, ви можете розмістити цю версію першою і, можливо, навіть зробити її трохи більшою, ніж інші.
Філіп

4
Firefox у Windows 7, 64-розрядна версія: navigator.cpuClass === undefined, navigator.platform === "Win32". IE9 на тій же машині, navigator.cpuClsas === "x86". Жодне з них не використовується для виявлення 64-розрядної Windows. navigator.userAgentмістить WOW64, однак, така відповідь є дійсною.
Кріс Морган,

19

Найбільш надійним рішенням було б створити 32-бітну програму завантажувача, яка виявляє архітектуру, а потім завантажує та встановлює відповідну версію вашого додатка.

Я перевірив дві інші відповіді від RC та Pino. Обидва вони не працюють через ту саму проблему, яку ви пропонуєте - 32-розрядна версія IE у 64-розрядної Windows буде неправильно ідентифікувати платформу як 32-розрядну. Оскільки більшість людей запускають 32-розрядний IE у 64-розрядної Windows (багато плагінів, наприклад, Flash не доступні в 64-розрядної версії), буде багато неточних ідентифікаційних даних

Лі


1
Я здогадуюсь, хтось (не я) проголосував проти, оскільки це не відповідає безпосередньо на запитання. Однак це альтернативний спосіб досягнення того, що я хочу зробити.
user9876

3
32-розрядна версія IE включає маркер WOW64, тому його буде легко вибрати.
Натан Осман,

На мою думку, найкраще та зручне для користувача рішення.
Раду,

Я точно ненавиджу цих установників, але це варіант, будь ласка, просто не дратуйте своїх користувачів, змушуючи їх потім також встановити вашу гарну панель інструментів.
Vitim.us

9

Не з 100% впевненістю, як ви стверджуєте, браузер може мати 32-бітну версію, а ОС - 64-бітну.

Щоб виявити браузер, спробуйте наступний код:

<script language=javascript>   
  <!--   
  document.write("CPU :"+window.navigator.cpuClass);   
  //-->   
</script> 

Процесор: ia64

Для IE.

http://msdn.microsoft.com/en-us/library/ms531090%28VS.85%29.aspx

Комерційний продукт: https://www.cyscape.com/showbrow.aspx


5
Це не стосується оригінального питання. Це створює "x86" у 64-розрядному вікні Windows 7 із використанням 32-розрядної IE. Запитанням було запитання щодо виявлення системної розрядності та ОС, а не розрядності браузера.
Піт,

5

Для 64-розрядної Windows з 64-розрядним IE window.navigator.platformбуде "Win64" і window.navigator.cpuClassбуде "x64".

Для 64-розрядної Windows з 32-розрядною версією IE window.navigator.platformбуде "Win32" і window.navigator.cpuClassбуде "x86".

Для 32-розрядної Windows window.navigator.platformбуде "Win32" і window.navigator.cpuClassбуде невизначеним (я думаю).

-

Джерело: Я створив додаток, який використовує JavaScript, щоб визначити, чи використовує хтось 32-розрядний чи 64-розрядний процесор . Ви можете побачити код тут на GitHub .


Ви неправильно висловлюєте свою останню думку, це не означає, що у користувача є 32-машинна машина Windows. Насправді все вищесказане просто надає інформацію про браузер, а не про ОС.
Mo Beigi

3

Я відновив результати гарного пошуку вище до цих функцій JS. Сподіваюся, що вони можуть допомогти всім тут швидко реагувати на їхні потреби (а також і на мої!)

function get_bits_system_architecture()
{
    var _to_check = [] ;
    if ( window.navigator.cpuClass ) _to_check.push( ( window.navigator.cpuClass + "" ).toLowerCase() ) ;
    if ( window.navigator.platform ) _to_check.push( ( window.navigator.platform + "" ).toLowerCase() ) ;
    if ( navigator.userAgent ) _to_check.push( ( navigator.userAgent + "" ).toLowerCase() ) ;

    var _64bits_signatures = [ "x86_64", "x86-64", "Win64", "x64;", "amd64", "AMD64", "WOW64", "x64_64", "ia64", "sparc64", "ppc64", "IRIX64" ] ;
    var _bits = 32, _i, _c ;
    outer_loop:
    for( var _c = 0 ; _c < _to_check.length ; _c++ )
    {
        for( _i = 0 ; _i < _64bits_signatures.length ; _i++ )
        {
            if ( _to_check[_c].indexOf( _64bits_signatures[_i].toLowerCase() ) != -1 )
            {
               _bits = 64 ;
               break outer_loop;
            }
        }
    }
    return _bits ; 
}


function is_32bits_architecture() { return get_bits_system_architecture() == 32 ? 1 : 0 ; }
function is_64bits_architecture() { return get_bits_system_architecture() == 64 ? 1 : 0 ; }

Перевірте:

document.write( "Which is my current bits system architecture ? " + get_bits_system_architecture() + "<br>" );

document.write( "Is it 32 bits ? " + ( is_32bits_architecture() ? "YES" : "NO" ) + "<br>" );

document.write( "Is it 64 bits ? " + ( is_64bits_architecture() ? "YES" : "NO" ) );

Спасибі всім!


2

Я використовував такий код:

var is32BitBrowser = true;
if( window.navigator.cpuClass != null && window.navigator.cpuClass.toLowerCase() == "x64" )
   is32BitBrowser = false;
if( window.navigator.platform.toLowerCase() == "win64" )
   is32BitBrowser = false;

Це працювало скрізь, як очікують комп'ютери Mac. І, на жаль, здається, що отримати таку інформацію за допомогою JavaScript неможливо :(. Однак тут можна було зробити ще один фокус. Оскільки Adobe не підтримував програвач Flash у браузерах x64, ви можете просто спробувати його виявити. Якщо виявлення буде успішним, ніж це, безумовно, 32-розрядний браузер, якщо ні, то це 32-розрядний браузер без флеш-плагіна або це 64-розрядний браузер, оскільки рівень проникнення Flash-плеєра досить великий (див. http://www.adobe.com/products/player_census/ flashplayer / version_penetration.html ), це повинно бути достатньо, щоб принаймні виявити браузер x32 під Mac.


1

64-розрядна IE у 64-розрядної Windows для будь-якого браузера Internet Explorer

if (navigator.userAgent.indexOf("MSIE") != -1 && navigator.userAgent.indexOf("Win64") != -1 && navigator.userAgent.indexOf("x64") != -1){

   alert("This is 64 bit browser");

}
else {

   alert("Not 64 bit browser");

}

1

І window.navigator.cpuClass, і window.navigator.platform повертають платформу браузера. Не системна платформа. Отже, якщо ви використовуєте 32-розрядний браузер у 64-розрядної системі, тоді обидва варіанти повернуть 32-розрядну. Що було б неправильно.


1

Я знайшов це старе запитання і подумав про оновлення за допомогою недавньої знайденої бібліотеки з відкритим кодом: https://github.com/faisalman/ua-parser-js

Згідно з документацією, метод getCPU() returns { architecture: '' }, з наступними можливими значеннями: 68k, amd64, arm, arm64, avr, ia32, ia64, irix, irix64, mips, mips64, pa-risc, ppc, sparc, sparc64.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.