漫威中非洲国家“瓦坎达”与祖鲁人有什么关系!

作者:小菜 更新时间:2025-02-27 点击数:
简介:电影《黑豹》的背景放在了一个虚构出来的非洲国家“瓦坎达”。

这不仅让人想起非洲祖鲁族,电影中的瓦坎达在设定中,依靠振金得以掌握了非常高的科

【菜科解读】

电影《黑豹》的背景放在了一个虚构出来的非洲国家“瓦坎达”。

这不仅让人想起非洲祖鲁族,电影中的瓦坎达在设定中,依靠振金得以掌握了非常高的科技,并且也是因为振金,他们制造出了威力能够和现代兵器相媲美的冷兵器。

而电影中许多奇奇怪怪的非洲冷兵器,倒是在现代都能找得到原型。

我们就以《黑豹》作为开端,来聊聊撒哈拉以南的非洲知名冷兵器。

  撒哈拉以南非洲最有名的武器,那莫过于祖鲁人所使用的恩古尼盾(Nguni shield)和短矛的组合。

在祖鲁战争期间,祖鲁武士正是依靠着这些即使从冷兵器的角度来看,也是非常简陋的武器,硬是和英国军队进行了惨烈卓绝的正面对抗,结果是英国军队失败了!

祖鲁战争时期的祖鲁军队

  电影中,男主在进行王位挑战时所使用的盾牌,正是恩古尼盾。

顾名思义,这种盾牌实际上并非祖鲁人特有。

最早使用这种盾牌的是生活在非洲南部的恩古尼人。

不过恩古尼人并不是将这种盾牌用于战争,而是将它们更多的用于宗教仪式,或者是当作一种身份象征。

而在祖鲁语中,这种盾牌被称作“isihlangu”。

不过祖鲁人所使用的恩古尼盾其实也是种类繁多,并且每一个品种的恩古尼盾都有不同的使用场合。

在祖鲁国王沙卡·祖鲁时代,这位杰出的军事领袖,对祖鲁军队进行了改革,只有长度达5英尺的恩古尼盾才可以称之为“isihlangu”。

除此之外,还有一种体型稍小,只有3.5英尺的恩古尼盾被祖鲁人称之为“umbumbuluzo”。

这种盾牌虽然比“isihlangu”要小,但是却也更加坚固,并且易于持握,所以也很受祖鲁人的欢迎。

  木制,外层覆以牛皮的恩古尼盾。

在祖鲁传统中,牛是一种重要的货币,因此只有牛皮才能用来制作恩古尼盾  恩古尼盾的使用方法,是通过用恩古尼盾猛击对手,来使对方失去平衡,或者是直接用盾牌,来勾走敌人的盾牌。

祖鲁人还会通过晃动盾牌,来对敌人进行挑衅。

恩古尼盾其实还有一些骚操作,比如祖鲁人就曾经通过让士兵列队,并用恩古尼盾来对自己进行伪装,使得他们看起来就像是正在放牧中的牛群,从而做到诱敌深入。

  由于恩古尼盾表面的牛皮基本没有进行处理,因此伪装起来,还是颇有迷惑性的  不过,恩古尼盾最主要的,还是在狩猎狮子、豹之类猛兽时使用。

在日常生活中,恩古尼盾有时也会被祖鲁人当成雨伞,甚至有时直接用来搭建棚屋。

与此同时,恩古尼盾还是部族的象征,在平时所有的恩古尼盾,全部是由国王或者部落首领管理,因此每一个手持这种盾牌的人,都必须小心地保管自己的盾牌。

一旦丢失,就会受到国王或者部落首领严厉的惩罚。

而且每一块盾牌的颜色,实际上也是有相当严格的规定,因为这些颜色和图案实际上也代表着使用者的部落和家族。

在祖鲁人信仰中,他们保留了恩古尼人对于恩古尼盾的崇拜,他们认为每一块盾牌都有着神灵的力量和特性,因此盾牌也常常被用来净化死去的敌人。

而国王所用的的盾牌中,每一块也代表着不同的宗教含义。

如何设置总是在新窗口或新选项卡中打开网页?

IE9.0中文版官方(32Bit&64Bit) 授权:免费软件 大小:17.7M 语言: 简体 怎么,设置,总,是在,新窗口,新,窗口,或,新选项,

.net将Word,Pdf等文档文件中的文本提取出来代码分享

经常有人问我怎么将类似word,pdf这样的文档转换为文本然后索引,.net 这方面的解决方案不是很多,为了方便大家,我花了一天时间自己做了一个。

Java 版本的 lucence 提供了一个 tika 的工具用于将 word, excel, pdf 等文档转换为文本,然后进行索引。

但这个工具没有 .net 版本,要在 .net 下用,需要用 IKVM.net,很麻烦。

而且这个工具实际上底层是调用 POI 和 PDFParse 来转换的。

从网上搜索到的信息看,POI 对 office 2007 以上版本的文档处理有问题,不知道最新版本是否解决了,我没有试过。

PDFParse 这个东西,我用过 .net 版本,对中文不支持,不知道 Java 版本是否支持。

其实 .net 下完全不需要用这些开源解决方案来解决,因为微软提供了一个官方的解决方案,这个解决方案叫 IFilter,这个过滤器是为 sql server 的全文索引设计的,但第三方软件可以调用API来完成文档的提取工作。

为了方便大家,我把 IFilter 转换的功能封装到了一个开源的组件中去,大家可以到下面地址去下载源码:HBTextParse.调用很简单:这个是提取文件中的文本到字符串的代码if (openFileDialog.ShowDialog() == DialogResult.OK) //要转换的文件 textBoxFilePath.Text = openFileDialog.FileName; //实例化 TextParse ,传入要转换的文件路径 TextParse textParse = new TextParse(textBoxFilePath.Text); //提取文件中的文本,并输出 richTextBoxView.Text = textParse.ConvertToString();}这个是将文件转换为文本文件的代码:if (saveFileDialog.ShowDialog() == DialogResult.OK) //实例化 TextParse,传入要转换的文件的路径 TextParse textParse = new TextParse(textBoxFilePath.Text); //将文件转换到 saveFileDialog.FileName 指定的文本文件中 textParse.ConvertToFile(saveFileDialog.FileName); catch (Exception ex) MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}要注意的问题是提取 Pdf 文档,如果机器是 64为操作系统,必须要安装Adobe PDF iFilter 9 for 64-bit platforms. 否则会报异常。

这个问题我搞了将近一天才搞定。

支持的文档类型:目前这个组件可以支持所有 Microsoft office 提供的文档类型,包括 *.rtf, *.doc, *.docx, *.xls, *.xlsx, *.ppt, *.pptx 等等除了微软Office的文档外,还可以转换html 文档:可以把html文档中的文本提取出来(不包含标签)Pdf 文档:我测试过,对中文支持没有问题Txt 文档这个代码的核心部分是一个叫 FilterCode 的类。

这个类是从http://ifilter.codeplex.com/这个地方下载的,我对这个类做了改进,加入了转换到文件的方法。

我把这个类的代码贴出来,如果对如何调用IFilter的windows API感兴趣,可以参考这段代码IFilter 的相关API函数如下:通常这些API函数就可以通过IFilter接口提取文本。

[DllImport("query.dll", SetLastError = true, CharSet = CharSet.Unicode)] static extern int LoadIFilter(string pwcsPath, [MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter, ref IFilter ppIUnk); [ComImport, Guid("89BCB740-6119-101A-BCB7-00DD010655AF")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IFilter /// /// The IFilter::Init method initializes a filtering session. /// [PreserveSig] IFilterReturnCodes Init( //[in] Flag settings from the IFILTER_INIT enumeration for // controlling text standardization, property output, embedding // scope, and IFilter access patterns. IFILTER_INIT grfFlags, // [in] The size of the attributes array. When nonzero, cAttributes // takes // precedence over attributes specified in grfFlags. If no // attribute flags // are specified and cAttributes is zero, the default is given by // the // PSGUID_STORAGE storage property set, which contains the date and // time // of the last write to the file, size, and so on; and by the // PID_STG_CONTENTS // ‘contents‘ property, which maps to the main contents of the // file. // For more information about properties and property sets, see // Property Sets. int cAttributes, //[in] Array of pointers to FULLPROPSPEC structures for the // requested properties. // When cAttributes is nonzero, only the properties in aAttributes // are returned. IntPtr aAttributes, // [out] Information about additional properties available to the // caller; from the IFILTER_FLAGS enumeration. out IFILTER_FLAGS pdwFlags); /// /// The IFilter::GetChunk method positions the filter at the beginning /// of the next chunk, /// or at the first chunk if this is the first call to the GetChunk /// method, and returns a description of the current chunk. /// [PreserveSig] IFilterReturnCodes GetChunk(out STAT_CHUNK pStat); /// /// The IFilter::GetText method retrieves text (text-type properties) /// from the current chunk, /// which must have a CHUNKSTATE enumeration value of CHUNK_TEXT. /// [PreserveSig] IFilterReturnCodes GetText( // [in/out] On entry, the size of awcBuffer array in wide/Unicode // characters. On exit, the number of Unicode characters written to // awcBuffer. // Note that this value is not the number of bytes in the buffer. ref int pcwcBuffer, // Text retrieved from the current chunk. Do not terminate the // buffer with a character. [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder awcBuffer); /// /// The IFilter::GetValue method retrieves a value (public /// value-type property) from a chunk, /// which must have a CHUNKSTATE enumeration value of CHUNK_VALUE. /// [PreserveSig] IFilterReturnCodes GetValue( // Allocate the PROPVARIANT structure with CoTaskMemAlloc. Some // PROPVARIANT // structures contain pointers, which can be freed by calling the // PropVariantClear function. // It is up to the caller of the GetValue method to call the // PropVariantClear method. // ref IntPtr ppPropValue // [MarshalAs(UnmanagedType.Struct)] ref IntPtr PropVal); /// /// The IFilter::BindRegion method retrieves an interface representing /// the specified portion of the object. /// Currently reserved for future use. /// [PreserveSig] IFilterReturnCodes BindRegion(ref FILTERREGION origPos, ref Guid riid, ref object ppunk); }从文档中提取文本的代码如下: /// /// Utilizes IFilter interface in Windows to parse the contents of files. /// /// Path - Location of file to parse /// Buffer - Return text artifacts /// Raw set of strings from the document in plain text format. public void GetTextFromDocument(string path, ref StringBuilder buffer) IFilter filter = null; int hresult; IFilterReturnCodes rtn; // Initialize the return buffer to 64K. buffer = new StringBuilder(64 * 1024); // Try to load the filter for the path given. hresult = LoadIFilter(path, new IntPtr(0), ref filter); if (hresult == 0) IFILTER_FLAGS uflags; // Init the filter provider. rtn = filter.Init( IFILTER_INIT.IFILTER_INIT_CANON_PARAGRAPHS | IFILTER_INIT.IFILTER_INIT_CANON_HYPHENS | IFILTER_INIT.IFILTER_INIT_CANON_SPACES | IFILTER_INIT.IFILTER_INIT_APPLY_INDEX_ATTRIBUTES | IFILTER_INIT.IFILTER_INIT_INDEXING_ONLY, 0, new IntPtr(0), out uflags); if (rtn == IFilterReturnCodes.S_OK) STAT_CHUNK statChunk; // Outer loop will read chunks from the document at a time. For those // chunks that have text, the contents will be pulled and put into the // return buffer. bool bMoreChunks = true; while (bMoreChunks) rtn = filter.GetChunk(out statChunk); if (rtn == IFilterReturnCodes.S_OK) // Ignore all non-text chunks. if (statChunk.flags != CHUNKSTATE.CHUNK_TEXT) continue; // Check for white space items and add the appropriate breaks. switch (statChunk.breakType) case CHUNK_BREAKTYPE.CHUNK_NO_BREAK: break; case CHUNK_BREAKTYPE.CHUNK_EOW: buffer.Append(‘ ‘); break; case CHUNK_BREAKTYPE.CHUNK_EOC: case CHUNK_BREAKTYPE.CHUNK_EOP: case CHUNK_BREAKTYPE.CHUNK_EOS: buffer.AppendLine(); break; // At this point we have a text chunk. The following code will pull out // all of it and add it to the buffer. bool bMoreText = true; while (bMoreText) // Create a temporary string buffer we can use for the parsing algorithm. int cBuffer = DefaultBufferSize; StringBuilder sbBuffer = new StringBuilder(DefaultBufferSize); // Read the next piece of data up to the size of our local buffer. rtn = filter.GetText(ref cBuffer, sbBuffer); if (rtn == IFilterReturnCodes.S_OK || rtn == IFilterReturnCodes.FILTER_S_LAST_TEXT) // If any data was returned, scrub it and then add it to the buffer. CleanUpCharacters(cBuffer, sbBuffer); buffer.Append(sbBuffer.ToString()); // If we got back some text but there is no more, terminate the loop. if (rtn == IFilterReturnCodes.FILTER_S_LAST_TEXT) bMoreText = false; break; // Once all data is exhausted, we are done so terminate. else if (rtn == IFilterReturnCodes.FILTER_E_NO_MORE_TEXT) bMoreText = false; break; // Check for any fatal errors. It is a bug if you land here. else if (rtn == IFilterReturnCodes.FILTER_E_NO_TEXT) System.Diagnostics.Debug.Assert(false, "Should not get here"); throw new InvalidOperationException(); // Once all chunks have been read, we are done with the file. else if (rtn == IFilterReturnCodes.FILTER_E_END_OF_CHUNKS) bMoreChunks = false; break; else if (rtn == IFilterReturnCodes.FILTER_E_EMBEDDING_UNAVAILABLE || rtn == IFilterReturnCodes.FILTER_E_LINK_UNAVAILABLE) continue; else throw new COMException("IFilter COM error: " + rtn.ToString()); else // If you get here there is no filter for the file type you asked for. Throw an // exception for the caller. throw new InvalidOperationException("Failed to find IFilter for file " + path); } .net,将,Word,Pdf,等,文档,文件,中的,文本,

加入收藏
               

漫威中非洲国家“瓦坎达”与祖鲁人有什么关系!

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录